Python网络爬虫(四)——信息标记与提取方法

信息的标记

image
作用:

  • 标记后的信息可形成信息组织结构,增加了信息维度
  • 标记的结构与信息一样具有重要价值
  • 标记后的信息可用于通信、存储或展示
  • 标记后的信息更利于程序理解和运用

    HTML的信息标记

    image
    image

    信息标记有哪些种类呢?

    信息标记的三种形式
  • XML
  • JSON
  • YAML

    XML

    image

空元素的缩写形式

<img src=“china.jpg” size=“10” />

注释书写形式

<!‐‐ This is a comment, very useful ‐‐>

常见书写形式

<name> … </name>
<name />
<!‐‐ ‐‐>

XML实例

<person>
<firstName>Tian</firstName>
<lastName>Song</lastName>
<address>
<streetAddr>中关村南大街5号</streetAddr>
<city>北京市</city>
<zipcode>100081</zipcode>
</address>
<prof>Computer System</prof><prof>Security</prof>
</person>

JSON

image
常见书写形式
image
image

“key” : “value”
“key” : [“value1”, “value2”]
“key” : {“subkey” : “subvalue”}

JSON实例

{
“firstName” : “Tian” ,
“lastName” : “Song” ,
“address” : {
“streetAddr” : “中关村南大街5号” ,
“city” : “北京市” ,
“zipcode” : “100081”
} ,
“prof” : [ “Computer System” , “Security” ]
}

YAML

image
缩进表达所属关系

name :
newName : 北京理工大学
oldName : 延安自然科学院

表达并列关系

name :
‐北京理工大学
‐延安自然科学院

| 表达整块数据# 表示注释

text: | #学校介绍
北京理工大学创立于1940年,前身是延安自然科学院,是中国共产党创办的第一所理工科大学,
毛泽东同志亲自题写校名,李富春、徐特立、李强等老一辈无产阶级革命家先后担任学校主要领
导。学校是新中国成立以来国家历批次重点建设的高校,首批进入国家“211程”和“985工程”建
设行列;在全球具有广泛影响力的英国QS“世界大学500强”中,位列入选的中国大陆高校第15
位。学校现隶属于工业和信息化部。

常见书写形式

key : value

key : #Comment
‐value1
‐value2

key :
subkey : subvalue

YAML实例

firstName : Tian
lastName : Song
address :
streetAddr : 中关村南大街5号
city : 北京市
zipcode : 100081
prof :
‐Computer System
‐Security

三种信息标记形式的比较

XML 最早的通用信息标记语言,可扩展性好,但繁琐。Internet上的信息交互与传递。
JSON 信息有类型,适合程序处理(js),较XML简洁。移动应用云端和节点的信息通信,无注释。
YAML 信息无类型,文本信息比例最高,可读性好。各类系统的配置文件,有注释易读。

信息提取的一般方法

从标记后的信息中提取所关注的内容,XML,JSON,YAML(标记, 信息)

方法一:

完整解析信息的标记形式,再提取关键信息,XML JSON YAML
需要标记解析器,例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢

方法二:

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

融合方法:

结合形式解析与搜索方法,提取关键信息
需要标记解析器及文本查找函数

基于bs4库的HTML内容查找方法

<>.find_all()

<>.find_all(name, attrs, recursive, string, **kwargs)

name:对标签名称的检索字符串返回一个列表类型,存储查找的结果
attrs:对标签属性值的检索字符串,可标注属性检索
recursive:是否对子孙全部检索,默认True
string:<>…</>中字符串区域的检索字符串

<tag>(..) 等价于<tag>.find_all(..)
soup(..) 等价于soup.find_all(..)

扩展方法

方法 说明
<>.find() 搜索且只返回一个结果,同.find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent() 在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数
加载评论框需要翻墙