(五)基于bs4库的HTML内容检索
(1)信息的标记
-
标记后的信息可形成信息组织结构,增加了信息维度
-
标记的结构和信息一样具有重要价值
-
标记后的信息可用于通信、存储或展示
-
标记后的信息更利于程序理解和运用
-
例:HTML是WWW(World Wide Web)的信息组织方式
-
HTML通过预定义的<>…</>标签形式组织不同类型的信息
(2)信息标记的三种形式
1.XML
<!-- XML(eXtensible Markup Language) -->
<!-- 标签tag -->
<!-- 名称img 后接属性 -->
<img src="china.jpg" size="10">...</img>
<!-- 空元素的缩写形式 -->
<img src="china.jpg" size="10" />
<name>...</name>
<name />
<!-- -->
2.JSON
- 根据JSON规范,不支持注释
- 主要是为防止过多的注释,影响文件本身数据载体的目的
JSON(JavaScript Object Notation)
//有类型的键值对 key:value
//"name"是类型
"name" : "靓仔"
//多值用[,]组织
"name" : ["靓仔", "美眉"]
//键值对嵌套用{,}
"name" : {
"newName" : "钢铁侠二代" ,
"oldName" : "钢铁侠一代"
}
//三种书写形式
"key" : "value"
"key" : ["value1", "value2"]
"key" : {"subkey" : "subvalue"}
3.YAML
YAML(YAML Ain't Markup Language)
# 无类型的键值对 key:value
# name仅是字符串
name : 靓仔
# 缩进表达所属关系
name :
newName : 钢铁侠二代
oldName : 钢铁侠一代
# - 表达并列关系
name :
-钢铁侠二代
-钢铁侠一代
# | 表达整块数据
text: | #示例乱码
sdadadwafaqagerghehreqtggfqegqeg
regrqegrqegeqgreqgregqegqergqert
# 三种书写形式
key : value
key : #Comment
-value1
-value2
key :
subkey : subvalue
(3)三种信息标记形式的比较
-
XML
-
最早的通用信息标记语言,可扩展性好,但繁琐
-
Internet上的信息交互与传递
-
JSON
-
信息有类型,适合程序处理(js),较XML简洁
-
移动应用云端和节点的信息通信,无注释
-
YAML
-
信息无类型,文本信息比例最高,可读性好
-
各类系统的配置文件,有注释易读
(4)信息提取及方法
- 信息提取:从标记后的信息中提取所关注的内容
1.一般方法一
- 完整解析信息的标记形式,再提取关键信息
- (XML、JSON、YAML)
- 需要标记解析器,例如:bs4库的标签树遍历
- 优点:信息解析准确
- 缺点:提取过程繁琐,速度慢
2.一般方法二
- 无视标记形式,直接搜索关键信息
- 搜索:对信息的文本查找函数即可
- 优点:提取过程简洁,速度较快
- 提取结果准确性与信息内容相关
3.融合方法
- 结合形式解析和搜索方法,提取关键信息
- (XML、JSON、YAML、搜索)
- 需要标记解析器及文本查找函数
4.实例
(5)基于bs4库的HTML内容查找方法
# 返回一个列表类型,存储查找的结果
<>.find_all(name, attrs, recursive, string, **kwargs)
# 检索目标标签名为a,b
soup.find_all('a')
soup.find_all(['a','b'])
# 检索目标标签名为p,含属性course
soup.find_all('p','course')
# 检索目标含指定属性,引入re库(正则表达式库)
soup.find_all(id='link1')
soup.find_all(id=re.compile('link'))
#由于find_all方法很常用,为方便使用
<tag>(..) 等价于 <tag>.find_all(..)
soup(..) 等价于 soup.find_all(..)
参数名 | 说明 |
---|---|
name | 对标签名称的检索字符串 |
attrs | 对标签属性值的检索字符串 |
recursive | 是否对子孙全部检索,默认True |
string | <>…</>中字符串区域的检索字符串 |
方法 | 说明 |
---|---|
<>.find() | 搜索且只返回一个结果,字符串类型 |
<>.find_parents() | 在先辈节点中搜索,返回列表类型 |
<>.find_parent() | 在先辈节点中返回一个结果 |
<>.find_next_siblings() | 在后续平行节点中搜索,返回列表类型 |
<>.find_next_sibling() | 在后续平行节点中返回一个结果 |
<>.find_previous_siblings() | 在前序平行节点中搜索,返回列表类型 |
<>.find_previous_sibling() | 在前序平行节点中返回一个结果 |
方法 | 说明 |
---|---|
<>.find() | 搜索且只返回一个结果,字符串类型 |
<>.find_parents() | 在先辈节点中搜索,返回列表类型 |
<>.find_parent() | 在先辈节点中返回一个结果 |
<>.find_next_siblings() | 在后续平行节点中搜索,返回列表类型 |
<>.find_next_sibling() | 在后续平行节点中返回一个结果 |
<>.find_previous_siblings() | 在前序平行节点中搜索,返回列表类型 |
<>.find_previous_sibling() | 在前序平行节点中返回一个结果 |