信息标记的三种形式
信息的标记
- 标记后的信息可形成信息组织结构,增加了信息的维度
- 标记后的信息可用于通信、存储或展示
- 标记的结构与信息一样具有重要价值
- 标记后的信息更利于程序理解和运用
信息标记的三种形式:
XML、 JSON、 YAML
- XML eXtensible Markup Language
- JSON JavaScript Object Notation
"key":"value"
"key":["value1","value2"]
"key":{"subkey":"subvalue"}
- YAML YAML Ain't Markup Language
- 无类型键值对 key:value,缩进来表达所属关系
name: 北京理工大学
name:
newName:北京理工大学
oldName:延安自然科学院
\- 表达并列关系
name:
\- 北京理工大学
\- 延安自然科学院
| 表达整块数据 \# 表示注释
text: | #学校介绍
北京理工大学创立于1940年,前身是。。。。。
三种信息标记形式的比较
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实例
{
"firstName" : "Tian" ,
"lastName" : "Song" ,
"address" : {
"streetAddr" : "中关村南大街5号" ,
"city" : "北京市" ,
"zipcode" : "100081"
} ,
"prof" : [ "Computer System", "Security" ]
}
YAML实例
firstName : Tian
lastName : Song
address :
streetAddr : 中关村南大街5号
city : 北京市
zipcode : 100081
prof :
- Computer System
- Security
比较
XML 最早的通用信息标记语言,可扩展性好,但繁琐。
JSON 信息有类型,适合程序处理(js),较XML简洁。
YAML 信息无类型,文本信息比例最高,可读性好
用途
XML Internet上的信息交互与传递。
JSON 移动应用云端和节点的信息通信,无注释。
YAML 各类系统的配置文件,有注释易读。
信息提取的一般方法
- 方法一:完整解析信息的标记形式,再提取关键信息。
XML JSON YAML
需要标记解析器 例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢。 - 方法二:无视标记形式,直接搜索关键信息
搜索
对信息的文本查找函数即可。
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关。
融合方法:结合形式解析与搜索方法,提取关键信息
XML JSON YAML 搜索
需要标记解析器及文本查找函数。
实例
提取HTML中所有URL链接
思路:1)搜索到所有a标签
2)解析a标签格式,提取href后的链接内容。
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, "html.parser")
for link in soup.find_all('a'):
print(link.get('href'))
基于bs4库的HTML内容查找方法
<>.find_all(name, attrs, recursive, string, **kwargs)
返回一个列表类型,存储查找的结果。
name:对标签名称的检索字符串。
attrs:对标签属性值的检索字符串,可标注属性检索。
recursive:是否对子孙全部检索,默认True。
string:<>..</>中字符串区域的检索字符串。
soup.find_all('a')
soup.find_all(['a', 'b'])
import re
for tag in soup.find_all(re.compile('b')):
print(tag.name)
soup.find_all('p', 'course')
soup.find_all(id='link1')
import re
soup.find_all(id=re.cmpile('link'))
soup.find_all('a', recursive=False)
soup.find_all(string = "Basic Python")
import re
soup.find_all(string = re.compile("python"))
<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()参数 |