Python爬虫学习(五)基于bs4库的HTML内容检索

(五)基于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)
  1. 需要标记解析器,例如:bs4库的标签树遍历
  2. 优点:信息解析准确
  3. 缺点:提取过程繁琐,速度慢

2.一般方法二

  • 无视标记形式,直接搜索关键信息
  1. 搜索:对信息的文本查找函数即可
  2. 优点:提取过程简洁,速度较快
  3. 提取结果准确性与信息内容相关

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() 在前序平行节点中返回一个结果
发布了10 篇原创文章 · 获赞 1 · 访问量 137

猜你喜欢

转载自blog.csdn.net/qq_39419113/article/details/105635138