from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'lxml')
一、通过操作方法进行解读搜索
网页中有用的信息都存在于网页中的文本或者各种不同标签的属性值,为了能获取这些有用的网页信息,可以通过一些查找方法获取文本或者标签属性。
find() 方法:
用于查找符合查询条件的第一个标签节点。
find_all() 方法:
查找所有符合查询条件的标签节点,并返回一个列表。
find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
① name 参数
查找所有名字为 name 的标签,但字符串会被自动忽略。
在搜索的方法中传入一个字符串,BeautifulSoup 对象会查找与字符串完全匹配的内容。
# 查找文档中所有的 <b> 标签
soup.find_all('b')
如果传入一个正则表达式,那么 BeautifulSoup 对象会通过 re 模块的 match() 函数进行匹配。
# 使用正则表达式 “^b” 匹配所有以字母 b 开头的标签
import re
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
如果是传入一个列表,那么 BeautifulSoup 对象会将与列表中任一元素匹配的内容返回。
# 找到文档中所有的 <a> 标签和 <b> 标签
soup.find_all(["a", "b"])
② attrs 参数
如果某个指定名字的参数不是搜索方法中内置的参数名,那么在进行搜索时,会把该参数当作指定名称的标签中的属性来搜索。
# 在 find_all() 方法中传入名称为 id 的参数,BeautifulSoup对象会搜索每个标签的 id 属性
soup.find_all(id="active")
如果传入多个指定名字的参数,则可以同时过滤出标签中的多个属性。
# 搜索每个标签的 id 属性,又可以搜索 href 属性
import re
soup.find_all(href=re.compile('com'), id="submit-btn")
# 搜索的标签名称为 class
soup.find_all("a", class_="btn")
由于 class 属于 Python 的关键字,所以在 class 的后面加上一个下划线 class_。
有些标签的属性名称是不能使用的,在 HTML5 中的 “data-” 属性,在程序中使用时,会出现 SyntaxError 异常信息。
可以通过 find_all() 方法的 attrs 参数传入一个字典来搜索包含特殊属性的标签。
data_soup = BeautifulSoup("<div data-value="key">value</div>", "lxml")
data_soup.find_all(attrs={"data-value": "key"})
③ text 参数
通过在 find_all() 方法中传入 text 参数,可以搜索文档中的字符串内容。text 参数也可以接受字符串、正则表达式和列表。
soup.find_all(text="value")
soup.find_all(text=["active", "value", "key"])
④ limit 参数
使用 limit 参数限制返回结果的数量。
soup.find_all("a", limit=5)
⑤ recursive 参数
在调用 find_all() 方法时,BeautifulSoup 对象会检索当前节点的所有子节点。如果只想搜索当前节点的直接子节点,就可以使用参数 recursive=False
soup.html.find_all("title", recursive=False)