HTLM是WWW的信息组织方式
H->hyper,
T->text,
M->markup,
L->language,
HTML通过预定义的<>…</>标签形式组织不同类型的信息.
<html><head><title>This is a python demo page</title></head>
<body>
<p class="title"><b>The demo python introduces several python courses.</b></p>
<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>
</body></html>
信息标记的一般种类,
XML 扩展标记语言,与html形式相近,通过标签形式来构建信息
JSON(JavaScript Object Notation) 有类型的键值对key:value构建的信息表达方式
"name":"北京理工大学"
"name":["北京理工大学","延安自然科学院"]
"name":{
"newName":"北京理工大学"
"oldName":"延安自然科学院"
}//键值对嵌套使用
YAML(YAML Ain’t Markup Language) 使用无类型的键值对构建信息
使用缩进来表达所属关系
使用’-'表达并列关系
name:
name:北京理工大学
oldName:延安自然科学院
#使用缩进来表达所属关系
name:
-北京理工大学
-延安自然科学院
#使用'-'表达并列关系,一个名字对应两个值
text:| #学校介绍
北京理工大学(Beijing Institute of Technology)是中国共产党创办的第一所理工科大学,隶属于中华人民共和国工业和信息化部,是全国重点大学,首批进入国家“211工程”、“985工程”,首批进入世界一流大学建设高校A类行列.
三种形式比较:
XML 是最早的通用信息标记语言,可扩展性好,但繁琐
JSON 信息有类型,适合程序处理(js),较XML简洁.
YAML 信息无类型,文本信息比例最高,可读性好.
XML Internet上的信息交互与传递.html是XML这一类别的.
JSON 移动应用云端和节点的信息通信,无解释.JSON用在程序对接口处理的地方,JSON数据在作为程序代码的一部分,并被程序直接运行时,JSON格式中对信息类型的定义才能最大的发挥作用.缺点:无法体现注释.
YAML 各类系统的配置文件中,有注释易读.应用较广.
信息提取的一般方法
方法一:完整解析信息的标记形式,再提取关键信息.
XML JSON YAML
需要标记解释器 例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢.
方法二:无视标记形式,直接搜索关键信息.
搜索
对信息的文本查找函数即可.
优点:提取过程简洁,速度较快.
缺点:提取结果的准确性与信息内容相关.
融合方法
结合形式解析与搜索方法,提取关键信息.
实例:
提取HTML中所有URL链接
思路:
1)搜索到所有标签
2)解析标签格式,提取href后的链接内容
import requests
from bs4 import BeautifulSoup
url = "http://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo, "html.parser") # 以html格式进行解析
for link in soup.find_all('a'):
print(link.get('href'))
beautiful soup中提供方法find_all()可以在soup中查询信息
<>.find_all(name,attrs,recursive,string,**kwargs)
返回一个列表类型,储存查找的结果.
#name:对标签名称的检索字符串.
soup.find_all('a') #查找<a>..</a>标签
soup.find_all(['a', 'b']) #查找a标签和b标签
for tag in soup.find_all(True): #查找所有标签
print(tag.name) #打印标签的名字
for tag in soup.find_all(re.compile('b')):#使用正则表达式查找以b开头的标签
print(tag.name)
#attrs:对标签属性值的检索字符串,可标注属性检索.
soup.find_all('p', 'course') #查找带有course属性值的p标签
soup.find_all(id='link1') #直接对属性做相关的约定,此为精确查询,不多也不少,若要同时查找属性为link的标签则需要正则表达式的支持
soup.find_all(id=re.compile('link'))#查找属性以link开头的标签
#recursive:是否对子孙全部搜索,默认True
soup.find_all('a', recursive=False) #只在soup的儿子节点层面查找a标签
#string:对标签中字符串区域(<>...</>)进行字符串检索.也就是文本信息
soup.find_all(string='Basic Python') #同样是精确查找
soup.find_all(string=re.compile('Python'))#查找所有带Python的字符串
由于find_all()函数非常常用,为此beautiful soup库提供了简写方式
< tag>(…) 等价于 < tag>.find_all(…)
soup(…) 等价于 soup.find_all(…)
soup.find提供了7个扩展方法.相较于find_all方式只是检索区域不同.