0%

使用 Beautiful Soup 解析 HTML

利用 Python 库 Beautiful Soup(bs4)从 HTML 文件中提取信息。

简介:一款 HTML 解析工具

Beautiful Soup 是一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

它自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 导入库
from bs4 import BeautifulSoup

# 指定文件并读取
file = open('./legalgeek.html','r', encoding='utf-8')
html = file.read()

# 将文件内容解析为 BeautifulSoup 对象
bs = BeautifulSoup(html,"lxml")

# 常用全局类操作
print(bs.prettify()) # 格式化html结构打印
print(bs.get_text()) # 从html文档中获取所有文字内容

使用 “节点选择器” 获取元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 常用操作
print(bs.title) # 获取title标签的全部内容
print(bs.title.name) # 获取title的name属性
print(bs.title.string) # 获取title标签中的文本

print(bs.head) # 获取head标签的所有内容
print(bs.head.contents) # .content 属性可以将标签的子节点以列表的方式输出

print(bs.div) # 获取第一个div标签中的所有内容
print(bs.div["id"]) # 获取第一个div标签的id的值

print(bs.a) # 获得第一个 a 标签
print(bs.a.attrs) # 把 a 标签的所有属性打印输出,得到的类型是一个字典

使用 “方法选择器” 获取元素

1
2
3
4
5
6
7
8
9
10
11
print(bs.find_all("a")) # 获取所有的 a 标签

print(bs.find(id="zml")) # 获取第一个 id="zml" 的标签

# 获取所有的a标签,并遍历打印a标签中的href的值:
for item in bs.find_all("a"):
print(item.get("href"))

# 获取所有的a标签,并遍历打印a标签中的文本:
for item in bs.find_all("a"):
print(item.get_text())

使用 “CSS选择器” 获取元素

Beautiful Soup 支持大部分的CSS选择器,在 Tag 获取 BeautifulSoup 对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 通过标签名查找
print(bs.select('title'))
print(bs.select('a'))

# 通过类名查找
print(bs.select('.mnav'))

# 通过id查找
print(bs.select('#u1'))

# 组合查找
print(bs.select('div .bri'))

# 属性查找
print(bs.select('a[class="bri"]'))
print(bs.select('a[href="https://blog.legalhub.cn/"]'))

# 直接子标签查找
t_list = bs.select("head > title")
print(t_list)

# 兄弟节点标签查找
t_list = bs.select(".mnav ~ .bri")
print(t_list)

# 获取标签的内容
t_list = bs.select("title")
print(bs.select('title')[0].get_text())

提取元素中内容的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 要获取一个标签的完整html代码,只需要写它的节点选择器即可:
print(bs.title)

# 利用 .name 属性来获取节点的类型(p、a、title):
print(bs.title.name)

# 调用 .string 属性就可以得到节点内的文本:
print(bs.title.string)

# 利用 get_text方法,可以获取标签下所有文本:
print(bs.p.get_text())

# 调用 .attrs 获取所有属性,可以通过中括号加属性名称获取特定属性的值:
print(bs.p.attrs)
print(bs.p.attrs['name'])