一、信息标记
1、信息标记的意义
(1)标记后的信息可形成信息组织结构,增加了信息维度
(2)标记后的信息可用于通信、存储或展示
(3)标记的结构和信息一样具有重要价值
(4)标记后的信息更利于程序理解和运用
HTML(Hyper Text Markup Language)超文本标记语言,是WWW(Word Wide Web)的信息组织方式,可以将声音、图像、视频等超文本信息嵌入文本中。通过预定义的<>…</>标签形式组织不同类型的信息。
2、信息标记的三种形式
(1)XML
XML(eXtensible Markup Language),可扩展标记语言
一般形式 <name>…</name>
1 <img src = “china.jpg” size = “10”>中国</img>
空元素的缩写形式 <name />
1 <img src = “china.jpg” size = “10” />
注释书写形式 <!-- -->
1 <!-- This is a comment, very useful -->
(2)JSON
JSON(JavaScript Object Notation),JavaScript对象简谱
有类型的键值对 key:value
单个值 “key”:”value”
1 “name”:”北京理工大学”
多个值用[,] “key”:[“value1”,”value2”
1 “name”:[ ”北京理工大学”,”延安自然科学院”]
嵌套用{,} “key”:{“subkey”:”subvalue”}
1 “name”:{ 2 “newName”:”北京理工大学”, 3 “oldName”:”延安自然科学院” 4 }
(3)YAML
YAML(YAML Ain’t Markup Language)
无类型的键值对 key:value
单个值 key:value
1 name:北京理工大学
多个值 -表达并列关系
1 key: 2 -value1 3 -value2 4 name: 5 -北京理工大学 6 -延安自然科学院
嵌套
key:
subkey:subvalue
1 name: 2 newName:北京理工大学 3 oldName:延安自然科学院
|表达整块数据 #表示注释
content:| #comment
value
1 text:| #学校简介 2 北京理工大学(Beijing Institute of Technology)隶属于中华人民共和国工业和信息化部,是全国重点大学,首批进入国家“211工程”、“985工程”,首批进入世界一流大学建设高校A类行列,入选学位授权自主审核单位、高等学校学科创新引智计划、高等学校创新能力提升计划、卓越工程师教育培养计划、国家建设高水平大学公派研究生项目、国家大学生创新性实验计划、国家级大学生创新创业训练计划、新工科研究与实践项目、中国政府奖学金来华留学生接收院校、全国深化创新创业教育改革示范高校、首批高等学校科技成果转化和技术转移基地,工业和信息化部高校联盟、中国人工智能教育联席会成员。
3、三种信息标记形式的比较
标记语言 | 特点 | 应用 |
XML | 最早的通用信息标记语言,可扩展性好,但繁琐 | Internet上的信息交互与传递 |
JSON | 信息有类型,适合程序处理(js),较XML简洁 | 移动应用云端和节点的信息通信,无注释 |
YAML | 信息无类型,文本信息比例最高,可读性好 | 各类型系统的配置文件,有注释易读 |
(1)XML实例
1 <person> 2 <firstName>Tian</firstName> 3 <lastName>Song</lastName> 4 <address> 5 <streetAddr>中关村南大街5号</streetAddr> 6 <city>北京市</city> 7 <zipcode>100081</zipcode> 8 </address> 9 <prof>Computer System</prof><prof>Security</prof> 10 </person>
(2)JSON实例
1 { 2 “firstName”:”Tian”, 3 “lastName”:”Song”, 4 “address”:{ 5 “strettAddr”:”中关村南大街5号”, 6 “city”:”北京市”, 7 “zipcode”:”100081” 8 }, 9 “prof”:[“Computer System”,”Security”] 10 }
(3)YAML实例
1 firstName:Tian 2 lastName:Song 3 address: 4 streetAddr:中关村南大街5号 5 city:北京市 6 zipcode:100081 7 prof: 8 -Computer System 9 -Security
二、信息提取
方法 | 手段 | 条件 | 优点 | 缺点 |
完整解析信息的标记形式,再提取关键信息 |
XML、JSON、YAML |
需要标记解析器,例如:bs4库的标签树遍历 |
信息解析准确 | 提取过程繁琐,速度慢 |
无视标记形式,直接搜索关键信息 |
搜索 |
对信息的文本查找函数即可 |
提取过程简洁,速度较快 | 提取结果准确性与信息内容相关 |
结合形式解析与搜索方法,提取关键信息 |
XML、JSON YAML、搜索 |
需要标记解析器及文本查找函数 |
× | × |
基于bs4库的HTML内容查找方法
以"http://python123.io/ws/demo.html"文档为例
1 import requests 2 from bs4 import BeautifulSoup 3 r = requests.get("http://python123.io/ws/demo.html") 4 demo = r.text 5 soup = BeautifulSoup(demo,"html.parser") 6 print(soup.prettify()) 7 <html> 8 <head> 9 <title> 10 This is a python demo page 11 </title> 12 </head> 13 <body> 14 <p class="title"> 15 <b> 16 The demo python introduces several python courses. 17 </b> 18 </p> 19 <p class="course"> 20 Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses: 21 <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1"> 22 Basic Python 23 </a> 24 and 25 <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2"> 26 Advanced Python 27 </a> 28 . 29 </p> 30 </body> 31 </html>
<>.find_all(name,attrs,recursive,string,**kwargs)
返回一个列表类型,存储查找的结果
name:对标签名称的检索字符串
attrs:对标签属性值的检索字符串,可标注属性检索
recursive:是否对子孙全部检索,默认True
string:<>…</>中字符串区域的检索字符串
name参数:
(1)检索a标签
1 soup.find_all("a") 2 [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
(2)检索a、b标签
1 soup.find_all(["a","b"]) 2 [<b>The demo python introduces several python courses.</b>, <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
(3)如参数为True,则检索所有标签名
1 for tag in soup.find_all(True): 2 print(tag.name) 3 html 4 head 5 title 6 body 7 p 8 b 9 p 10 a 11 a
(4)检索标签名以'b'开头的所有标签
1 import re #引入正则表达式库 2 for tag in soup.find_all(re.compile('b')): 3 print(tag.name) 4 body 5 b
attrs参数:
(1)带有"course"属性值的p标签
1 soup.find_all('p',"course") 2 [<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses: 3 <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>]
(2)id属性值为"link1"的标签
1 soup.find_all(id = "link1") 2 [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>]
(3)id属性值为"link"的标签
1 soup.find_all(id = "link") 2 []
(4)id属性值中包含"link"的标签
1 import re #引入正则表达式库 2 soup.find_all(id = re.compile("link")) 3 [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
recursive参数:
1 soup.find_all("a") #recursive默认为True 2 [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>] 3 soup.find_all("a",recursive = False) #令recursive为True 4 [] #soup的儿子标签中没有a标签
string参数:
(1)检索字符串区域为“Basic Python”的字符串
1 soup.find_all(string = "Basic Python") 2 ['Basic Python']
(2)检索字符串区域出现"python"的字符串
1 soup.find_all(string = re.compile("python")) 2 ['This is a python demo page', 'The demo python introduces several python courses.']
<tag>(…)等价于<tag>.find_all(…)
soup(…)等价于soup.find_all(…)
<>.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 ()参数 |