信息的标记:
- 形成信息组织结构,增加信息维度
- 有利于通讯,存储和展示
- 标记的结构和信息一样有着重要的价值
- 有利于程序理解与处理,应用
HTML的信息标记:
html是www(World Wide Web)的信息组织方式,将声音,图像,视频等超文本信息嵌入到文本中
html是通过预定义的<>...</>标签形式将不同类型信息组织起来的
1、信息标记的三种形式:
XML、JSON、YAML
XML:e
xtensible
markup
language 扩展标志语言 ,采用以标签为主来构建信息以及表达信息
XML标签中有名字(Name),属性(Attribute)等相关内容(与html非常接近):
<img src="XXX.jpg" size="10">..相关内容..</img>
<img src="XXX.jpg" size="10" /> #空元素的缩写形式,也就是中间内容相关内容的情况下可以这样写
<!--This is a comment--> #注释书写形式,以尖括号叹号开头,并且以尖括号结尾
JSON:
Javs
script
object
natation ,有类型的
键值对key:value 构建的信息表达
"name":"北京理工大学"
"name":["北京理工大学","延安自然科学院"] #多个值的形式
注意:
键值对可以嵌套使用,使用{,}:
"name": {
"newname":"北京理工大学"
"oldname":"延安自然科学院"
}
YAML:
YAML
Ain't
Markup
Language 递归定义,采用
无类型键值对key:value来构建信息表达
eg:
name: 北京理工大学
通过
缩进的方式表达所属关系:
name:
newname:
北京理工大学
oldname:
延安自然科学院
通过
减号 (-)表达并列关系: #多个值
name:
-
北京理工大学
-
延安自然科学院
用
竖线(|)表达整块数据,
#表示
注释
2、三种信息标志形式比较
XML
定义了一个人,信息如下:
firstname
lastname
address:
- 街道
- 所在城市
- 邮编
prof(专业)
XML形式:需要将每个信息域定义相关标签,采用嵌套组织起来(
问题:标签定义的相关语法!!)
JSON
同样是定义标签,注意双引号,类型处理
YMAL
以上比较结果:
XML:
- 最早的通用信息标记语言,可扩展性好,但繁琐。
- Internet上信息交互与传递
JSON:
- 信息有类型,适合程序处理(js),较XML简洁。
- 移动应用云端和节点的信息通信,无注释。(一般用在程序对接口处理的地方,JSON数据在经过传输之后能够作为程序代码一部分并被程序直接运行,最大发挥了JSON中类型定义的作用)
YMAL:
- 信息无类型,文本信息比例最高,可读性好。
- 应用于各类系统的配置文件,有注释易读。
3、信息提取的一般方法
无论是XML、JSON、还是是YAML,信息中包含标志和信息内容
- 完整解析信息的标记形式,再提取关键信息。此时需要标记解析器,例如bs4库的标签树遍历(信息解析准确但过程繁琐速度慢,要求对信息表达有一定的了解)
- 无视标记形式,直接搜索关键信息,就像在百度上搜索一样(信息提取简便,速度快,但结果准确性与信息内容相关)
- 结合形式解析和搜索方法,提取关键信息,需要标记解析器和文本查找函数。
eg:
提取HTML中所有URL连接:
思路:
- 搜索到所有<a>标签
- 解析<a>标签格式,提取href后的链接内容
from bs4 import BeautifulSoup as bs #beautifulsoup4库使用时是简写的bs4
import requests
r = requests.get('http://python123.io/ws/demo.html') #获得网页内容
import requests
r = requests.get('http://python123.io/ws/demo.html') #获得网页内容
demo = r.text
soup = bs(demo,'html.parser') #解析器:html.parser,解析标记
for link in soup.find_all('a'):
#查找<a>标签内容,并打印信息
print(link.get('href'))
运行结果:
结合形式解析和搜索小结:
- 首先获得网页内容(requests,get,r.text)
- 其次解析网页(BeautifulSoup,‘html.parser’ )
- 检索(find_all)
4、基于bs4库的HTML内容查找方法
在soup变量(也就是
解析后的变量) 中查找,
此时,正则表达式的运用很重要!!
<>.find_all(name, attrs, recursive, string, **kwargs) #返回一个列表,存储查找结果
name——对
标签名称的检索字符串
例如:
- ‘a’ #查找a标签
- ['a', 'b'] #查找a,b标签
- True #当前所有标签
- re.compile('b') #查找b开头的所有标签,需要正则表达式库:re
attrs——对
标签属性值的检索字符串,进行标注属性检索,注意:属性是由键和值构成的。
recursive——布尔值类型,是否对子孙全部检索,默认为True,如果是false,则是只检索儿子节点
string——对<>...</>中字符串区域的字符串进行检索,结合正则表达式,灵活检索
值得注意的是:
<tag>() 等价于 <tag>.find_all()
soup() 等价于 soup.find_all()
find_all()的扩展方法: