Python爬虫必知必会:BeautifulSoup之find_all参数速览

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

find_all( name , attrs/class_ , recursive , string , **kwargs )

name:标签名搜索
attrs/class_:属性/类名搜索
recursive:限定直接子节点
string:文档字符串搜索

1. 标签名搜索——name

name 参数可以查找所有标签名为 name 的tag,字符串对象会被自动忽略掉.

#简单的用法如下
soup.find_all("title")

#支持多标签搜索
soup.find_all(name=['div','p'])

重申: 搜索 name 参数的值可以使任一类型的 过滤器 ,字符窜,正则表达式,列表,方法或是 True .

2. 基于标签的属性查找——attrs/class_/id/title/…

通过标签属性查找的方式适用大多数标签属性,包括id,style,title,但有 “-”,Class标签属性例外。详解如下:

2.1 通用方式属性搜索——attrs

比如html5标签中的data-custom属性,如果我们这样

soup.find(data-custom="custom")#错误写法

那么则会报错。原因是在python中变量不能含有"-"这个字符,而我们传递的data-custom有这个字符。

解决办法是在attrs属性用字典进行传递参数

soup.find(attrs={'data-custom':'custom'})

2.2 CSS类名搜索——class_

通过 class_ 参数搜索有指定CSS类名的tag(可简写):

soup.find_all("a", "sister") #class_="sister"
#‘class’在python中是保留字,所以使用时需加‘下划线_’

tag的 class 属性是 多值属性 .按照CSS类名搜索tag时,可以分别搜索tag中的每个CSS类名:

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

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

搜索 class 属性时也可以通过CSS值完全匹配:

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

3. 文档字符串内容搜索——string

通过 string 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, string 参数接受 字符串 , 正则表达式 , 列表, True . 看例子:

soup.find_all(string=["Tillie", "Elsie", "Lacie"])
# [u'Elsie', u'Lacie', u'Tillie']

soup.find_all(string=re.compile("Dormouse"))
[u"The Dormouse's story", u"The Dormouse's story"]

string 还可以与其它参数混合使用来过滤tag.
下面代码用来搜索内容里面包含“Elsie”的标签:

soup.find_all("a", string="Elsie")
# [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]

4. 限定直接子节点——recursive

调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .

附:简写小技巧

BeautifulSoup 对象和 tag 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 find_all() 方法相同,下面两行代码是等价的:

soup.find_all("a")
soup("a")

参考文献

[1] delong(翻译).Beautiful Soup 4.4.0 文档[EB/OL].BeautifulSoup官方文档. https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id27
[2] 做梦当财神.BeautifulSoup中的find/find_all[EB/OL].博客园,2017-11-20. https://www.cnblogs.com/keye/p/7868059.html

  • 10
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值