用处:和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
比较:
抓取工具 | 速度 | 使用难度 | 安装难度 |
---|---|---|---|
正则re | 最快 | 困难 | 无(内置) |
Beautiful Soup | 慢 | 最简单 | 简单 |
lxml(xpath) | 快 | 简单 | 简单 |
【基础】
bs4的入门:
0. 安装: pip install beautifulsoup4
1. 导入模块:from bs4 import BeautifulSoup
2. 创建BeautifulSoup对象
参数一:解析的文本内容
参数二:使用的解析器,一般为lxml(必须添加,否则会发出警告)
3. 格式化输出 soup 对象的内容
【示例】
"""
bs4的入门:
0. 安装: pip install beautifulsoup4
1. 导入模块:from bs4 import BeautifulSoup
2. 创建BeautifulSoup对象
参数一:解析的文本内容
参数二:使用的解析器,一般为lxml(必须添加,否则会发出警告)
3. 格式化输出 soup 对象的内容
"""
# 1. 导入模块
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 2. 创建BeautifulSoup对象
# 注意点:
# 1.填写解析库 lxml(否则会报错)
# 2.标签自动补全
soup = BeautifulSoup(html, 'lxml')
# 3. 格式化输出 soup 对象的内容
print(soup.prettify())
格式 | 说明 |
---|---|
(1)节点的选择 | soup对象.标签名 |
(2)文本内容获取 | soup对象.标签名.string |
soup.标签名.get_text() | |
(3)属性获取 | soup.标签名.get() |
soup.标签名.attrs | |
(4)获取子元素列表 | soup.标签名.contents |
soup.标签名.children |
【示例】
# 1. 导入模块
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 2. 创建BeautifulSoup对象
# 注意点:
# 1.填写解析库 lxml(否则会报错)
# 2.标签自动补全
soup = BeautifulSoup(html, 'lxml')
# (1)节点选择
# 格式:soup对象.标签名(默认获取一条对象)
print(soup.title)
print(soup.p)
# (2)文本内容获取 --> get_text()
# 格式:soup对象.标签名.string (获取到一个bs4中NavigableString对象)
print(soup.title.string)
print(type(soup.title.string)) #
# 格式:soup.标签名.get_text() (获取到字符串 str)
print(soup.title.get_text())
print(type(soup.title.get_text())) #
# (3)属性获取 --> get()
# A. 获取属性内容
# 格式:soup.标签名.get()
# 注意:如果是class属性,返回的是 list ;如果是name,返回的是 str.
p = soup.p
print(p.get('name'))
print(type(p.get('name'))) #
print(p.get('class'))
print(type(p.get('class'))) #
# B. 获取所有属性名(字典)
# 格式:soup.标签名.attrs
print(p.attrs) # {'class': ['title'], 'name': 'dromouse'}
# 3. 格式化输出 soup 对象的内容
print(soup.prettify())
# (4)获取子元素
# 获取所有子标签
# A. 格式:soup.标签名.contents (获取一个列表)
print(soup.body.contents)
print(type(soup.body.contents)) #
# B. 格式:soup.标签名.children (获取一个迭代器,说明可以使用for循环)
print(soup.body.children)
print(type(soup.body.children)) #
children= soup.body.children
for child in children:
print(child)
【基本点】
【find函数】
1. 标签查询: soup.find("标签名")
2. 属性查询: soup.find(attrs={"属性名":"属性值"}) 或 soup.find("属性名"="属性值")
3. 文本内容查询:soup.find(text='文本内容')
4. 混合使用,一起查询
【find_all函数】
1. 标签查询: soup.find_all(["标签名1","标签名2"])
2. 属性查询: soup.find_all(attrs={"属性名":"属性值"}) 或 soup.find_all("属性名"="属性值")
3. 文本内容查询:soup.find_all(text='文本内容')
4. 混合使用,一起查询
【find & find_all函数的区别】
【findall函数】
# 1.返回值是一个列表
# 2.可以多标签查询
# 3.可以多条件查询
【示例】
(1)find函数
"""
【find函数】
1. 标签查询: soup.find("标签名")
2. 属性查询: soup.find(attrs={"属性名":"属性值"}) 或 soup.find("属性名"="属性值")
3. 文本内容查询:soup.find(text='文本内容')
"""
# 1. 导入模块
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 2. 创建BeautifulSoup对象
soup = BeautifulSoup(html, 'lxml')
# (1). 标签查询
# 格式: soup.find("标签名")==>soup.标签名 (返回一条标签对象)
# result = soup.find('title')
result = soup.find('p')
print(result)
print(type(result)) #
# (2). 属性查询
# 格式: soup.find(attrs={"属性名":"属性值"}) # 返回bs4.element.Tag标签对象
result = soup.find(
attrs={
'class': "story"
}
)
print(result)
print(type(result)) #
# 属性查询可以变成关键词查询
result = soup.find(id='link1')
print(result)
# (3). 文本内容查询
# 格式: soup.find(text='文本内容') (返回具体的文本内容bs4.element.NavigableString)
result = soup.find(text='...')
print(result)
print(type(result)) #
# (4). 混合使用,一起查询
result = soup.find(
'a',
attrs={
"id": 'link1'
},
)
print(result)
(2)find_all函数
"""
【findall函数】
返回值是一个列表
# 可以多标签查询
# 可以多条件查询
"""
# 1.返回值是一个列表
result = soup.find_all(
attrs={
'class':'sister'
}
)
print(result)
print(type(result)) #
for item in result:
print(item)
# 2.可以多标签查询
# 3.可以多条件查询
# 注意: soup.find(['b','p'])只能查询出最先匹配的标签
result = soup.find_all(
['b', 'a'],
attrs={
"class": 'sister',
"id": "link1"
}
)
print(result)
【基本点】
"""
【select函数】
支持 css 选择器:
(1)标签选择器(标签名)
(2)类选择器(点.)
(3)id选择器(#号)
(4)层级选择器
a. 后代选择器(空格\s)
b. 子代选择器(大于号>)
c. 平级选择器(或)(逗号,)
(5)属性选择器(标签名[属性名="属性值"])
# 与xpath区别是@
样式选择器(并):(无)
# 注意点:返回列表
"""
【示例】
# 1. 导入模块
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 2. 创建BeautifulSoup对象
soup = BeautifulSoup(html, 'lxml')
# select 支持css 选择器
# 支持 css 样式选择器:
# (1)标签选择器
# 格式:soup.select("标签名")
result = soup.select('p')
# (2)类选择器(.号)
# 格式:soup.select(".class类名")
result = soup.select(".title")
# (3)id选择器(#号)
# 格式: soup.select("#id名")
result = soup.select("#link1")
# (4)层级选择器
# a. 后代选择器(空格)
# 包括子孙级
result = soup.select('body a')
# b. 子代选择器(>号)
result = soup.select('head > title')
# c. 平级选择器(,号) (或)
result = soup.select('b,a')
# d. 样式选择器(无) (并)
result = soup.select('.title.title2')
# (5)属性选择器
# 格式: soup.select('标签名[属性名="属性值"]')
# 注意:区别是 @
# xpath: //p[@name="dromouse"]'
# css: p[name="dromouse"]
result = soup.select('p[name="dromouse"]')
print(result)
对象名 | 说明 |
---|---|
BeautifulSoup | 文档对象 |
Tag | 标签对象(属性、文本内容) |
NavigableString | 内容字符串对象 |
Comment | 注释对象 |
# 导入模块
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 创建BeautifulSoup对象
soup = BeautifulSoup(html, 'lxml')
# (1)BeautifulSoup 文档对象:bs4.BeautifulSoup
print(type(soup)) #
# (2)Tag 标签对象(属性、文本内容): bs4.element.Tag
print(type(soup.title)) #
# (3)NavigableString 内容字符串对象: bs4.element.NavigableString
print(type(soup.title.string)) #
# (4)Comment 注释对象: bs4.element.Comment
print(type(soup.a.string)) #