Python中的信息标记与提取

一、信息标记

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 ()参数

资料来源:《Python网络爬虫与信息提取》——嵩天,北京理工大学,MOOC

posted @ 2020-03-10 13:33  HuskySir  阅读(1325)  评论(0编辑  收藏  举报