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