文本标记
文本标记的三种形式
- XML(eXtensible Markup Language)
<name> … </name>
<name />
<!‐‐ ‐‐>
实例:
<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(JavaScript Object Notation)
“key” : “value”
“key” : [“value1”, “value2”]
“key” : {“subkey” : “subvalue”}
实例:
{
“firstName” : “Tian” ,
“lastName” : “Song” ,
“address” : {
“streetAddr” : “中关村南大街5号” ,
“city” : “北京市” ,
“zipcode” : “100081”
} ,
“prof” : [ “Computer System” , “Security” ] }
- YARM(YAML Ain’t Markup Language)
key : value
key : #Comment
‐value1
‐value2
key :
subkey : subvalue
实例:
firstName : Tian
lastName : Song
address :
streetAddr : 中关村南大街5号
city : 北京市
zipcode : 100081
prof : ‐Computer System
‐Security
三种信息标记形式的比较
形式 | 特点 | 比较 |
---|---|---|
XML | 最早的通用信息标记语言,可扩展性好,但繁琐 | Internet上的信息交互与传递 |
JSON | 信息有类型,适合程序处理(js),较XML简洁 | 移动应用云端和节点的信息通信,无注释 |
YARM | 信息无类型,文本信息比例最高,可读性好 | 各类系统的配置文件,有注释易读 |
信息提取
信息提取的一般方法
-
方法一:完整解析信息的标记形式,再提取关键信息
xml json yarm
需要标记解析器,例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢 -
方法二:无视标记形式,直接搜索关键信息
搜索
对信息的文本查找函数即可
优点:提取过程简洁,速度较快
缺点:提取结果准确与信息内容相关 -
融合方法:结合形式解析与搜索方法,提取关键信息
XML JSON YAML 搜索
需要标记解析器及文本查找函数
基于bs4库的HTML内容查找方法
<>.find_all(name, attrs, recursive, string, **kwargs)
- name : 对标签名称的检索字符串
- attrs: 对标签属性值的检索字符串,可标注属性检索
- recursive: 是否对子孙全部检索,默认True
- string: <>…</>中字符串区域的检索字符串
扩展方法
方法 | 说明 |
---|---|
<>.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()参数 |
简单实例
import requests
from bs4 import BeautifulSoup
def func(url):
header = {"user-agent" : "Mozilla/5.0"}
r = requests.get(url, headers=header)
r.raise_for_status()
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, "html.parser")
for tag in soup.find_all('a'):
print(tag.string)
print("------")
for tag in soup.find_all(True):
print(tag.name)
if __name__ == "__main__":
url = "http://www.baidu.com"
func(url)