BeautifulSoup 利用Find_all()多级标签索引和获取标签中的属性内容

BeautifulSoup find、findall()多级索引详解(附例题)

  • BeautifulSoup库的安装:

命令行运行:

pip3 install beautifulsoup4

文章以以海南大学起点论坛为例

标准选择器

find_all()

find_all( name , attrs , recursive , text , **kwargs )

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

常用参数

  • name:标签名,使用html标签名来索引
sb = soup.find_all('img')
  • atters

可根据标签名、属性、内容查找文档。

使用双属性来查找元素:

content = html.find(attrs = {'class':'p_opt','id':'card_1550_menu_content'})

注意find_all()方法返回的是一个列表!访问列表的内容需要使用下标:

content[n]	#注意下标从0开始

而访问列表元素的下一级元素则使用:.contents[n]来访问(也是从0开始的)

content[n].contents[m]	#注意下标从0开始

嵌套查询:

嵌套查询很常用:

例子:

ul = html.find_all('ul')    #查找ul标签下的内容、嵌套选择
for li in ul:
    print(li.find_all('li')) #打印多个ul中的每一个

find()

find(name, attrs, recursive, text, wargs)

find用法和findall一模一样,但是返回的是找到的第一个符合条件的内容输出。注意find()方法返回的不是列表,而是一个单个元素对象,想要访问该对象的子元素就直接使用.contents[n]即可,不需要再添加下表

上面的代码对应的冗余代码:

from bs4 import BeautifulSoup
import urllib
from urllib import request

url = 'http://www.ihain.cn/forum.php?mod=guide&view=newthread'
headers ={}
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31'
req = request.Request(url,None,headers = headers)
response = request.urlopen(req)
# 获得response对象
html = BeautifulSoup(response,'html.parser')

多级索引:

这里我们以一个例子来讲解多级索引

查找目标:

列表中的“起点百事通文本”

在这里插入图片描述

对应的html:

在这里插入图片描述

我们通过索引来逐步得到我们想要的内容:

  • 这里为什么要一步一步来呢? 因为很多网站的HTML的属性都是比较冗余的,无法一次精确就查找到元素,通过逐步索引我们可以缩小我们的抖索范围,达到精确索引的目的

先找到div,再找到第一个子元素ul:

在这里插入图片描述

div = html.find('div',id = 'nv')

找到ul标签,这里我直接用.contents[1]没有索引到,但是用[3]索引到了,可能原因是存在一些不可见元素,我们随机应变

在这里插入图片描述

print(div[0].contents[3],'\n') #ul

ul标签的子元素索引:

在这里插入图片描述

我们逐步寻找内容,找到我们想要的:

在这里插入图片描述

先找到ul下第二个子元素

print(div[0].contents[3].contents[1])#ul下的第二个li

在这里插入图片描述

再在ul下第二个子元素的第一个子元素确定a标签

print(div[0].contents[3].contents[1].contents[0])#ul下的第二个li下的第一个内容即<a>标签及其内容

找到文本:
在这里插入图片描述

print(div[0].contents[3].contents[1].contents[0].text)  #<a>的文本内容(起点百事通)

最终通过.get()方法获取标签中属性的链接

print(div[0].contents[3].contents[1].contents[0].get('href'))   #对应的链接内容

上面代码对应的冗余代码:

from bs4 import BeautifulSoup
import urllib
from urllib import request

url = 'http://www.ihain.cn/forum.php?mod=guide&view=newthread'
headers ={}
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31'
req = request.Request(url,None,headers = headers)
response = request.urlopen(req)
# 获得response对象
html = BeautifulSoup(response,'html.parser')

至此 BeatifulSoup的find_all的查找基本上已经可以满足查找需求了 ,但是更方便查找的是Xpath等索引方式,这是另一种查找内容的方式,本篇不做介绍~

  • 28
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
`find_all()`是BeautifulSoup的一个方法,用于查找HTML文档所有满足指定条件的标签。它的语法如下: ```python find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs) ``` 其,各参数的含义如下: - `name`:标签名或标签名列表,例如`'a'`、`['a', 'div']`。 - `attrs`:属性名和属性值的字典,例如`{'class': 'item', 'id': 'title'}`。 - `recursive`:是否递归查找子孙标签,默认为`True`。 - `text`:标签文本内容或正则表达式,例如`'hello'`、`'world'`、`'^\d+$'`。 - `limit`:返回结果集的最大数量,例如`10`,表示只返回前10个结果。 - `**kwargs`:可以用来传递自定义的过滤函数或其他参数。 `find_all()`方法会返回一个包含所有符合条件的标签的列表。例如,以下代码查找所有`<a>`标签,并打印它们的文本内容: ```python from bs4 import BeautifulSoup html_doc = """ <html> <head><title>测试文档</title></head> <body> <a href="https://www.baidu.com">百度搜索</a> <a href="https://www.google.com">谷歌搜索</a> </body> </html> """ soup = BeautifulSoup(html_doc, 'html.parser') links = soup.find_all('a') for link in links: print(link.text) ``` 输出结果为: ``` 百度搜索 谷歌搜索 ``` 这里的`find_all('a')`表示查找所有`<a>`标签,返回一个包含两个标签的列表。然后使用`for`循环遍历这个列表,打印每个标签的`text`属性,即标签的文本内容
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值