目录
概述
安装模块
常见用法
获得对象
搜索方法
BeautifulSoup是一种专门用于进行HTML/XML数据解析的一种描述语言,可以很好的分析和筛选HTML/XML这样的标记文档中的指定规则数据。在数据筛选过程中其基础技术是通过封装HTML DOM树实现的一种DOM操作,通过加载网页文档对象的形式,从文档对象树模型中获取目标数据。
BeautifulSoup操作简单易于上手,在很多对于数据筛选性能要求并不是特别苛刻的项目中经常使用,目前市场流行的操作版本是BeautifulSoup4,经常称BS4。
Xpath和BeautifulSoup都是基于DOM的一种操作模式。不同点在于加载文档对象模型DOM时出现的文档节点遍历查询操作过程,Xpath在进行遍历操作时针对描述语言指定的语法结构进行局部DOM对象树的遍历得到具体的数据,但是BS4在操作过程中,会将整个文档树进行加载然后进行查询匹配操作,使用过程中消耗资源较多,处理性能相对Xpath较低,但优势在于足够简单。
pip install beautifulsoup4
一般BS4将HTML文档对象会转换成如下四种类型组合的文档树:
* Tag:标签对象
* NavigableString:字符内容操作对象
* BeautifulSoup:文档对象
* Comment:特殊类型的NavigableString
from bs4 import BeautifulSoup
soup = BeautifulSoup("data
") # 获得文档对象(beautifulsoup)
# 返回data
# 以列表形式返回soup或标签的子节点
soup.contents
soup('p')
# 返回文档对象中所有p标签的列表[data
]
soup.p # 获得标签对象(tag)
# 返回文档对象中第一个p标签data
# 按标准格式输出文档对象
print(soup.prettify())
# 获得文档对象的所有内容
print(soup.get_text())
# 获取tag对象的name属性
print(soup.p.name) # 获得字符内容操作对象(NavigableString)
find_all( name , attrs , recursive , string , **kwargs )
name:需要搜索的子标签名称,搜索标签名称时可以使用的参数值包括字符串、正则表达式、列表和True
attrs:即keyword参数,如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索。搜索指定名字的属性时可以使用的参数值包括字符串、正则表达式、列表和True
recursive:默认检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False
string:需要搜索的子标签包含的字符串,可以使用的参数值包括字符串、正则表达式、列表和True
**kwargs:需要传入的其它参数,如limit=1传入可以限定搜索结果的数量,达到数量后停止搜索
find_all()
方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件,返回所有元素的列表。
soup.find_all("title") # 返回所有title标签列表
soup.find_all("p", "title") # 返回所有某个属性值为title的p标签列表
soup.find_all(id="link2") # 返回所有id属性值为link2的标签列表
soup.find(string=re.compile("sisters")) # 返回第一个匹配siters字符串的标签内容
soup.find_all(string=["Tillie", "Elsie", "Lacie"]) # 返回所有匹配列表元素的标签内容
soup.find_all(href=re.compile("elsie")) # 返回所有href属性匹配elsie值的标签列表
soup.find_all(id=True) # 返回所有包含id属性的标签列表
soup.find_all(href=re.compile("elsie"), id='link1') #同时过滤多个条件并返回匹配的标签列表
soup.find_all(string=re.compile("Dormouse")) # 返回所有模糊匹配Dormouse的标签内容
def is_the_only_string_within_a_tag(s):
""Return True if this string is the only child of its parent tag.""
return (s == s.parent.string)
soup.find_all(string=is_the_only_string_within_a_tag) # 参数传入方法并返回所有匹配的标签列表
但是,有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:
data_soup = BeautifulSoup('foo!')
data_soup.find_all(data-foo="value")
# SyntaxError: keyword can't be an expression
但是可以通过 find_all()
方法的 attrs
参数定义一个字典参数来搜索包含特殊属性的tag:
data_soup.find_all(attrs={"data-foo": "value"})
# [foo!]
按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class
在Python中是保留字,使用 class
做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 class_
参数搜索有指定CSS类名的tag:
soup.find_all("a", class_="sister")
# class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True
soup.find_all(class_=re.compile("itl"))
def has_six_characters(css_class):
return css_class is not None and len(css_class) == 6
soup.find_all(class_=has_six_characters)
find_all( name , attrs , recursive , string , **kwargs )
find_all()
方法搜索当前tag的第一个tag子节点,并判断是否符合过滤器的条件,并返回该元素。
Reference:https://beautifulsoup.readthedocs.io/zh_CN/latest/#id18