Beautiful Soup 是 Python 的一个第三方库,主要用于从 HTML 或 XML 文件中提取数据,它提供了简单的函数用来处理导航、搜索、修改分析树等功能。
简介文档
Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档
安装Beautiful Soup
pip install beautifulsoup4
pip install bs4
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,这里推荐使用第三方的解释器lxml。
安装lxml
pip install lxml
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) | 1. Python的内置标准库 2. 执行速度适中 3.文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) | 1. 速度快 2.文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, [“lxml”, “xml”]) BeautifulSoup(markup, “xml”) | 1. 速度快 2.唯一支持XML的解析器 3.需要安装C语言库 | |
html5lib | BeautifulSoup(markup, “html5lib”) | 1. 最好的容错性 2.以浏览器的方式解析文档 3.生成HTML5格式的文档 4.速度慢 | 不依赖外部扩展 |
Beautiful Soup 对象
创建Beautiful Soup对象
from bs4 import BeautifulSoup
bs = BeautifulSoup(html,"lxml")
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。
Tag
Tag对象就是HTML的一个个标签,例如 <div>
<title>
获取Tag对象
bs = BeautifulSoup(html,"lxml")
print(bs.title)
注:相同的标签只能获取第一个符合要求的标签
获取标签的属性
soup = BeautifulSoup(html, 'lxml')
# 获取所有属性
print(soup.div.attrs)
# 获取单个属性
print(soup.div["class"])
print(soup.div.get("float"))
print(soup.a["href"])
NavigableString
NavigableString
是Beautiful Soup库中的一个类,它用于表示 HTML 或 XML 标签内的文本内容。简单来说,当你解析一个 HTML 文档时,标签中间的纯文本部分会被封装成NavigableString
对象。
可以直接将NavigableString
对象当作字符串来使用,例如打印内容或进行字符串操作。
soup = BeautifulSoup(html, 'lxml')
print(soup.title.string) # 提取可用内容
print(soup.title.text) # 解析标签
print(type(soup.title.string))
# -> <class 'bs4.element.NavigableString'> ,如果存在注释,则为<class 'bs4.element.Comment'>对象
print(type(soup.title.text))
# -> <class 'str'>
NavigableString
是str
的子类,这意味着它继承了str
的大部分属性和方法。同时,它也可以作为标签对象的一部分,存在于文档树结构中。一个标签对象可以包含多个NavigableString
对象和其他子标签。
注:当一个标签内包含多个子标签时,tag.string
可能会返回None,这时可以使用 get_text()
获取标签中的所有内容。
Comment
在 Python 的Beautiful Soup库中,Comment
对象是用于处理 HTML 或 XML 文档中的注释内容的特殊对象,是NavigableString
的子类。
Beautiful Soup能够识别出文档中的注释部分,并将其封装为Comment
对象,以便与普通的文本内容区分开来。可以通过检查对象的类型来判断是否为注释。
可以像访问NavigableString
对象一样访问Comment
对象的内容,直接打印或进行字符串操作。
可以使用replace_with()
方法来修改注释的内容,使用extract()
方法来删除注释。
comment.replace_with('<!-- ' + new_comment + ' -->')
print(soup.prettify())
comment.extract()
print(soup.prettify())
在一些特别情景,需要对注释进行顾虑时
from bs4.element import Comment
if type(soup.strong.string) == Comment:
print(soup.strong.prettify())
else:
print(soup.strong.string)
Beautiful Soup方法
find_all() 搜索文档树
find_all
方法可以传递多种参数,搜索的返回值为一个列表。
find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
-
name:可以是标签名(字符串类型)、正则表达式、列表、True 或者自定义函数,用于指定要查找的标签名称。默认为
None
,表示查找所有标签。 -
attrs:一个字典,用于指定标签的属性和属性值,只有具有这些属性和对应值的标签才会被匹配。
-
recursive:布尔值,默认为
True
。如果设置为True
,则会递归地在所有子标签中查找;如果设置为False
,则只在直接子标签中查找。 -
string:可以是字符串、正则表达式、列表等,用于匹配标签内的文本内容。
-
limit:整数类型,用于限制返回结果的数量。如果设置了该参数,当找到指定数量的匹配项后,就会停止搜索。
-
**kwargs
:可以直接通过关键字参数来指定标签的属性,例如id='main'
表示查找id
属性为main
的标签。
# 传递字符串
print(soup.find_all("div")) # 返回所有的div标签
# 通过标签id查找
print(soup.find_all(id='title')) # 返回所有id为title的标签
# 通过标签属性查找
print(soup.find_all(class_="info")) # 返回所有属性为info的标签,因为class不能用作变量名,所以使用class_
# 传入字典,也可组合其他参数使用
print(soup.find_all(attrs={'float':'left'})) # 根据字典的键值匹配返回相应的标签
print(soup.find_all("div", attrs={"class": "info"})) # 返回标签属性为info的div标签
# 使用正则表达式查找
print(soup.find_all(re.compile("^div"))) # 查找以div开头的标签
print(soup.find_all(re.compile("^a"))) # 查找以a开头的标签
# 根据文本查找
print(soup.find_all('p', string=lambda text: 'text' in text if text else False)) # 在p标签中查找包含text的p标签
# limit可以限制返回标签的数量
print(soup.find_all("div", limit=2)) # 只返回查找到的前两个两个div标签
# 传入列表,匹配符合列表元素的标签返回
print(soup.find_all(['div', 'span'])) # 返回所有的div和span标签
# 将recursive设置为Fasle,可以直接在子标签中查找。
print(soup.find_all('p', recursive=False))
select css选择器
select()
方法允许你使用 CSS 选择器来查找 HTML 或 XML 文档中的元素。CSS 选择器是一种强大的模式匹配工具,提供了简洁且灵活的方式来定位文档中的特定元素。
soup.select(css_selector)
表达式 | 说明 |
---|---|
tag | 选择指定标签 |
* | 选择所有节点 |
#id | 选择id为container的节点 |
.class | 选取所有class包含container的节点 |
li a | 选取所有li下的所有a节点 |
ul + p | (兄弟)选择ul后面的第一个p元素 |
div#id > ul | (父子)选取id为id的div的第一个ul子元素 |
table ~ div | 选取与table相邻的所有div元素 |
a[title] | 选取所有有title属性的a元素 |
a[class=”title”] | 选取所有class属性为title值的a |
a[href*=”sxt”] | 选取所有href属性包含sxt的a元素 |
a[href^=”http”] | 选取所有href属性值以http开头的a元素 |
a[href$=”.png”] | 选取所有href属性值以.png结尾的a元素 |
input[type="redio"]:checked | 选取选中的hobby的元素 |
# 标签选择器,传入css标签
print(soup.select("div")) # 返回所有的div标签
# id选择器,添加#表示id
print(soup.select("#title")) # 返回所有id为title的标签
# 类选择器,. 表示类
print(soup.select(".info")) # 返回所有类属性为info的标签
# 属性选择器,[]来指定属性语属性值
print(soup.select("a[herf^='www']")) # 返回以www开头的带herf链接的a标签
print(soup.select("div[class='info']")) # 返回属性为info的div标签
# 子选择器,以 > 来表示子标签
print(soup.select("div > span")) # 返回div所包含的span子标签
# 后代选择器,以空格分离
print(soup.select("div span")) # 返回div标签中包含的所有span子标签
# 组合选择
print(soup.select("div.info > a")) # 返回属性为info的div标签包含的a子标签
# 通过css选择器获取标签的信息
print(soup.select("div.info > a")[0].get('href')) # 获取a标签的属性
print(soup.select("div.info > a")[0].text) # 获取a标签的内容
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)