Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。
官方文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
pip install beautifulsoup4
pin install lxml # lxml解析库
Beautiful Soup 支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python 默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。
# 导入 bs4 库
from bs4 import BeautifulSoup
# 字符串示例
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">...</p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
"""
# 创建 beautifulsoup 对象
# 默认bs4会调用系统中的lxml解析库,也可以主动设置bs4的解析库
soup = BeautifulSoup(html_doc,'lxml') # 设置解析库为 lxml
# 格式化输出
result=soup.prettify()
# 取title标签
result=soup.title
# 取title标签名
result=soup.title.name
# 取title标签内容,若标签下有多个内容时,返回None
result=soup.title.string
# 取title标签内容,若标签下有多个内容时,全部返回
result=soup.title.get_text()
# 取p标签,只会取第一个
result=soup.p
# 取p标签的类
result=soup.p['class']
# 取a标签(第一个)
result=soup.a
# 取a标签的href属性
result=soup.a['href']
# find -- 返回符合查询条件的第一个标签
# 指定标签名
result=soup.find(name="a") # 同 soup.find("a")
# 指定属性
result=soup.find(attrs={'id':'link1'})
# 指定内容
result=soup.find(text='Elsie')
# 组合条件
result=soup.find(
name='p',
attrs={'class':'story'}
)
#find_all --list
result=soup.find_all('a') # 取出所有a标签
result=soup.find_all('a',limit=2) # limit限制返回标签数
result=soup.find_all(attrs={'class':'sister'}) # 取出所有属性 class为sister的标签
result=soup.a.attrs # 获取a标签的所有属性
result=soup.select_one('.sister') # 取出class为sister的第一个标签
# ### CSS选择器 -- list
result=soup.select('.sister') # 类选择器,取出所有class为siser的标签
result=soup.select('#link1') # id选择器,取出所有id为link1的标签
result=soup.select('head title') # 取head标签中的title标签
result=soup.select('title,.title') # 取title标签 和 class为title的标签
result=soup.select('a[id="link2"]') # 取 a标签中 id为link2的标签
# # 标签包裹的内容
result=soup.select('.sister')[0].get_text() # 取class为sister的第一个标签的内容
# # 标签的属性
result=soup.select('.sister')[1].get('href') # 取class为siser的第二个标签的href属性
print(result)
print(type(result))