本文最后更新于 506 天前,其中的信息可能已经有所发展或是发生改变。
省流: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使用更广,可调的参数也更多。