目录
Beautiful Soup库
Beautiful Soup库是解析、遍历、维护"标签库"的功能库
标签树
<html>
<body>
<p class="title">...</p>
</body>
</html>
----------------------
标签:<p>...</p>
名称 Name(成对出现):p
属性 Attributes(0个或多个):class="title"
标签树的下行遍历
属性 | 说明 |
---|---|
.contents | 子节点的列表,将< tag >所有儿子节点存入列表 |
.children | 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
for child in soup.body.children:
print(child) #遍历儿子节点
for child in soup.body.descendants:
print(child) #遍历子孙节点
标签树的上行遍历
属性 | 说明 |
---|---|
.parent | 节点的父亲标签 |
.parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点 |
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
标签树的平行遍历
平行遍历发生再同一个父节点下的各节点间
属性 | 说明 |
---|---|
.next_sibling | 返回按照HTML文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 |
.previous_siblings | 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 |
for sibling in soup.a.next_sibling:
print(sibling)
for sibling in soup.a.nprevious_sibling:
print(sibling)
Beautiful Soup库的解析器
soup = BeautifulSoup('<html>data</html>','html.parser')
解析器 | 使用方法 | 条件 |
---|---|---|
bs4的HTML解析器 | soup = BeautifulSoup(mk,‘html.parser’) | 安装bs4库 |
lxml的HTML解析器 | soup = BeautifulSoup(mk,‘lxml’) | pip install lxml |
lxml的XML解析器 | soup = BeautifulSoup(mk,‘xml’) | pip install lxml |
html5lib的解析器 | soup = BeautifulSoup(mk,‘html5lib’) | pip install html5lib |
BeautifulSoup类的基本元素
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
Name | 标签的名字,< p >…</ p >的名字是’p’,格式:< tag >.name |
Attributes | 标签的属性,字典形式组织,格式:< tag >.attrs |
NavigableString | 标签内非属性字符串,<>…</> 中字符串,格式:< tag >.string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
bs4库的prettify()方法
.prettify()为HTML文本<>及其内容增加‘\n’
.prettify()可用于标签,方法:< tag >.prettify()
bs库的编码
bs4库将任何HTML输入都编程utf-8编码
信息标记的三种形式
XML
正常写法
<img src="china,jpg"sizez="10">...</img>
空元素的缩写形式
<img src="china,jpg"sizez="10" />
注释书写形式
<!-- This is a comment, very useful-->
JSON
有类型的键值对 key:value
#多值用[ , ]组织
"name" : ["北京理工大学",“延安自然科学院”]
#键值对嵌套用{ , }
"name" : {
newName:"北京理工大学",
"oldName":“延安自然科学院”
}
YAML
无类型键值对 key:value
name : 北京理工大学
# 缩进表达所属关系
name :
newName : 北京理工大学
oldName :延安自然科学院
# - 表达并列关系
name :
-北京理工大学
-延安自然科学院
# | 表达整块数据 #表示注释
text :|#学校介绍
北京理工大学...
三种信息标记形式的比较
XML :最早的通用信息标记语言,可扩展性好,但繁琐
JSON :信息有类型,适合程序处理,较XML简洁
YAML :信息无类型,文本信息比例最高,可读性好
应用
XML :Internet上的信息交互与传递
JSON :移动应用云端和节点的信息通信,无注释
YAML :各类系统的配置文件,有注释易读
信息提取的方法
方法一
完整解析信息的标记形式,再提取关键信息
需要标记解析器,例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢
方法二
无视标记形式,直接搜索关键信息
对信息的文本查找函数即可
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关
方法三
融合方法: 结合形式解析与搜索方法,提取关键信息
需要标记解析器及文本查找函数
ps
< tag >() 等价于 < tag >.find_all()
soup() 等价于 soup.find_all()
find()的扩展方法