bs4中的BeautifulSoup.find_all()函数

find_all()
find_all,顾名思义,就是查询所有符合条件的元素。给它传入一些属性或文本,就可以得到符合条件的元素,返回结果是列表类型。
语法格式:find_all( name , attrs , recursive , text , **kwargs )
各个参数含义如下:

参数说明
name检索标签的名称
attrs对标签属性值的检索字符串,可标注属性检索
recursive布尔型变量,是否对子孙全部检索,默认为True
text标签节点中文本
**kwargs可选参数

1.name
我们可以根据节点名来查询元素,示例如下:
我们首先我们导入bs4库,定义一个HTML实例代码,并创建beautifulsoup对象。

from bs4 import BeautifulSoup

html ="""
<html>
<head><meta charset="utf-8"><title>Python教程(www.sanmanong.com)</title></head>
<body>
<h1>我的第一个标题</h1>
<p class="title" name="sanmanong">Python教程学习网站
<a href="http://www.sanmanong.com" id="link1">三码农</a>
<a href="https://www.runoob.com/" id="link2">三码农</a>
<a href="https://www.w3school.com.cn/" id="link3">三码农</a>
</p>
<p class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
 <li class="element">Jay</li>
</p>
</body>
</html>
"""
soup = BeautifulSoup(html,'html.parser')  #创建 beautifulsoup 对象
print(soup.find_all(name = 'p'))  # 以标签名为p查询元素
输出结果:
[<p class="title" name="sanmanong">Python教程学习网站
<a href="http://www.sanmanong.com" id="link1">三码农</a>
<a href="https://www.runoob.com/" id="link2">三码农</a>
<a href="https://www.w3school.com.cn/" id="link3">三码农</a>
</p>, 
<p class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</p>]

print(soup.find_all(name = 'p')[0]) # 输出查询结果列表中的第一个元素
输出结果:
<p class="title" name="sanmanong">Python教程学习网站
<a href="http://www.sanmanong.com" id="link1">三码农</a>
<a href="https://www.runoob.com/" id="link2">三码农</a>
<a href="https://www.w3school.com.cn/" id="link3">三码农</a>
</p>

print(type(soup.find_all(name = 'p')[0]))
输出结果:
<class 'bs4.element.Tag'>

这里我们调用了find_all()方法,传入name参数,其参数值为p。也就是说,我们想要查询所有p节点,返回结果是列表类型,长度为2 ,每个元素依然都是bs4.element.Tag类型 。

因为都是Tag类型,所以依然可以进行嵌套查询。还是同样的文本,这里查询出所有p节点后,再继续查询其内部的a节点:

for i in soup.find_all(name = 'p'):
    print (i.find_all(name='a'))

输出结果:
[<a href="http://www.sanmanong.com" id="link1">三码农</a>,
 <a href="https://www.runoob.com/" id="link2">三码农</a>, 
 <a href="https://www.w3school.com.cn/" id="link3">三码农</a>
]
[]

因为此HTML中含有两个P标签,第一个p标签中含有子节点a,而第二个p标签中子节点为li,所以输出为空列表。返回结果是列表类型,列表中的每个元素依然还是Tag类型,接下来,就可以遍历每个a获取它的文本了。

for i in soup.find_all(name = 'p'):
    for x in i.find_all(name='a'):
        print(x.string) 
输出结果:
三码农
三码农
三码农

2.attrs
除了根据节点名查询,我们也可以传入一些属性来查询,示例如下。

print(soup.find_all(attrs = {'class':'list'}))
输出结果:
[<p class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</p>]

这里查询的时候传入的是attr 参数,参数的类型是字典类型。比如,要查询class为list的节点,可以传入 attrs = {‘class’:’list’}的查询条件,得到的结果是列表形式 ,包含的内容就是符合class为list的所有节点。在上面的例子中,符合条件的元素个数是1,所以结果是长度为1的列表。

对于一些常用的属性,比如id和class等,我们可以不用attrs来传递。比如,要查询id为list-1的节点,可以直接传人id这个参数。而对于class来说,由于class在Python里是一个关键字,所以后面需要加一个下划线,即class_=’list’。返回的结果依然还是Tag组成的列表。

print(soup.find_all(id='list-1'))
print(soup.find_all(class_='list'))

3.text
text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象,示例如下:
使用正则表达式需要导入re模块。

import re

print(soup.find_all(text ='Foo'))
print(soup.find_all(text=re.compile('san'))) 

输出结果:
['Foo']
['Python教程(www.sanmanong.com)']
  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我知道你想了解如何用 Python 爬取新浪微博评论。以下是一些步骤供您参考: 1. 安装必要的库 在使用 Python 爬取微博评论前,您需要安装一些必要的库。其,requests 和 BeautifulSoup 库是必不可少的。 您可以使用以下命令在终端安装它们: ``` pip install requests pip install beautifulsoup4 ``` 2. 登录微博并获取 cookie 在爬取微博评论之前,您需要登录您的微博账号并获取 cookie。 您可以使用 Chrome 浏览器登录您的微博账号。然后,按 F12 打开开发者工具,切换到“Network”选项卡并刷新页面。在“Filter”栏输入“comment”,然后点击“XHR”选项卡。 接下来,您可以在“Headers”选项卡找到“Request Headers”部分,复制“Cookie”字段的值。 3. 构造请求 URL 在获取 cookie 后,您需要构造请求 URL。以下是一个示例 URL:https://weibo.cn/comment/Jf3bhk1V5?uid=123456&page=1 其,Jf3bhk1V5 是微博的 ID,123456 是用户的 ID,page 是评论的页数。 您可以使用 requests 库发送 GET 请求并传递 cookie、微博 ID 和页数参数。 以下是一个示例代码: ``` import requests from bs4 import BeautifulSoup cookie = 'your_cookie_here' url = 'https://weibo.cn/comment/Jf3bhk1V5?uid=123456&page=1' headers = { 'Cookie': cookie } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 解析评论 ``` 4. 解析评论 最后,您需要解析页面上的评论。您可以使用 BeautifulSoup 库来解析 HTML。 以下是一个示例代码: ``` comments = soup.find_all('div', class_='c') for comment in comments: # 获取评论内容 content = comment.find('span', class_='ctt').text # 获取评论时间 time = comment.find('span', class_='ct').text # 获取评论用户 user = comment.find('a', class_='nk').text # 输出评论信息 print(f'{user}({time}): {content}\n') ``` 以上就是用 Python 爬取新浪微博评论的一些步骤。请注意,爬取微博评论可能会违反微博的使用协议,因此请谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值