1、概述
在上一篇文章中,主要介绍遍历文档树的方法。遍历文档树主要从文档的根节点开始,对文档进行逐一扫描。这是文档解析中一个非常重要的操作。除了这个操作之外,还有一个非常重要方式就是搜索文档树,搜索文档树并不是从根节点开始逐一的对文档进行操作,而是直接在整个文档中检索到我们需要节点以及内容。比如我们想获取一个文档的标题,可以直接索搜title标签,而不需要从本届点逐个进行遍历操作。
2、搜索文档树
搜索文档树的操作主要依靠以下两个方法来实现。
- find
- find_all
两个方法的使用方法基本相同,只是在数据返回上存在一定差别。find方法只返回符合条件的所有元素中的第一个,而find_all()方法会返回符合条件的所有元素。下面将详细介绍使用这两个方法搜索文档树的细节。
所谓细节就是可以使用哪些内容所谓搜索条件对整体文档树进行搜索。
2.1 过滤器
过滤器贯穿整个搜索的API.过滤器可以被用在tag的name中,节点的属性中,字符串中或他们的混合中。
2.1.1 字符串过滤器
最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的<p>标签,请参考如下代码:
for _p in soup.find_all('p'):
print(_p.name)
2.1.2 正则表达式过滤器
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容。如果我们想搜索文章中所有的H标签包含(H1-H6)可以使用此过滤器,请参考如下代码:
import re
for _p in soup.find_all(re.compile("^h[1-6]")):
print(_p.name)
输出结果如下图所示:
2.1.3 列表
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>标签和<b>标签,请参考如下代码:
for _p in soup.find_all(['a','b']):
print(_p.name)