BeautifulSoup中find_all()和select()的区别

省流:select()更简洁,但是find_all使用更广,可调的参数也更多。

  在学习bs4的过程中,发现有的文章教程是使用find_all(),有的使用select(),二者在功能上很像,而且都是返回页面中所有,所以有了一个疑问,二者有什么区别呢?。
  搜索了之后,有一篇文章将官方文档的解释扒了下来:
具体链接:find_all()和 select()的区别
具体就是:
select()是使用CSS选择器的语法找到tag 如:

soup.select("title") 
# [<title>The Dormouse's story</title>]

通过tag标签逐层查找:
soup.select("body a") #body子孙标签中的a标签
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

找到某个tag标签下的直接子标签
soup.select("p > a:nth-of-type(2)")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

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

soup.find_all("title")
# [<title>The Dormouse's story</title>]

css_soup.find_all("p", class_="body")
# [<p class="body strikeout"></p>]

反正我现在还看不懂,总之就是二者的底层实现不同。
但是功能是相同的。

后来找了半天,具体功能实现上也没啥区别,但是二者的使用方式不太一样:
find_all()方法

'''
find_all(name, attrs, recursive, string, limit, **kwargs)
@PARAMS:
	name: 查找的value,可以是string,list,function,真值或者re正则表达式
	attrs: 查找的value的一些属性,class等。
	recursive: 是否递归查找子类,bool类型
	string: 使用此参数,查找结果为string类型;如果和name搭配,就是查找符合name的包含string的结果。
	limit: 查找的value的个数
	**kwargs: 其他一些参数
'''

select()方法

'''
BeautifulSoup支持最常用的CSS选择器. 将字符串str传递到标签对象或者BeautifulSoup对象自身的select()方法中.
'''
soup.select("p.strikeout.body")

在具体的使用起来,就是一些情况下,select()更简洁:
比如多层次筛选:
搜索p标签下属性为info的标签
find_all():

p1=soup.find_all('p',class_='info')#或者
soup.find_all("p", attrs={"class": "info"})

select()方法

p2=soup.select('p.info')

总之
select()更简洁,但是find_all使用更广,可调的参数也更多。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值