文章目录
信息提取
一:信息标记的三种形式
1、XML(eXtensible Markup Language)
…
XML实例
<person>
<firstName>三</firstName>
<lastName>张</lastName>
<address>
<streeAddr>光棍村光棍街一号</streeAddr>
<city>光棍市</city>
<zipcode>1111</zipcode>
</address>
<prof>Computer System</prof><prpf>Security</prpf>
</person>
2、JSON(JavsScript Object Notation)
"key" : "value"
"key" : ["value1", "value2"]
"key" : {"subkey" : "subvalue"}
有类型的键值对 key:value
①、“key”:“value”
"name":四川
# 引号内的name作为类型
②、“key”:[“value1”,“value2”]
"name":["四川","川"]
#多个值用[,]组织
③、“key”:{“subkey”:“subvalue”}
"name":{
"newName":"川",
"oldName":"蜀"
}
#键值对嵌套用{,}
JSON实例
{
"firstName":"三",
"lastName":"张",
"address":{
"streeAddr":"光棍村光棍街一号",
"city":"光棍市",
"zipcode":"1111"
},
"prof":["Computer System","Security"]
}
3、YAML(YAML Ain’t Markup Language)
key : value key : #Comment value1 value2 key : subkey : subvalue
无类型键值对 key:value
name:"四川"
#这个时候的name仅仅是字符串
①、缩进表达所属关系
name:
newName:川
oldName:蜀
②、表达并列关系
name:
四川
川
③、表达整块数据 #表示注释
text:| 省份介绍
四川,简称川或蜀,是中国23个省之一,省会成都。位于中国西南地区内陆,界于北纬26°03′~34°19′,东经97°21′~108°12′之间,东连重庆,南邻云南、贵州,西接西藏,北接陕西、甘肃、青海。
firstName : 三
lastName : 张
address :
streetAddr : 光棍村光棍街一号
city : 光棍市
zipcode : 1111
prof :
Computer System
Security
二:三种信息标记形式的比较
种类 | 特点 |
---|---|
XML | Internet上的信息交互与传递;最早的通用信息标记语言,可扩展性好,但繁琐 |
JSON | 移动应用云端和节点的信息通信,无注释;信息有类型,适合程序处理(js),较XML简洁 |
YAML | 各类系统的配置文件,有注释易读;信息无类型,文本信息比例最高,可读性好 |
三:信息提取的一般方法
1、方法一:完整解析信息的标记形式,再提取关键信息
需要标记解析器,例如:bs4库的标签树遍历;
优点:信息解析准确 ;
缺点:提取过程繁琐,速度慢。
2、方法二:无视标记形式,直接搜索关键信息
对信息的文本查找函数即可
优点:提取过程简洁,速度较快;
缺点:提取结果准确性与信息内容相关。
3、方法三(融合):结合形式解析与搜索方法,提取关键信息
需要标记解析器及文本查找函数
实例
1、提取HTML中所有URL链接
思路:搜索到所有标签,解析标签格式,提取href后的链接内容
import requests
from bs4 import BeautifulSoup
response = requests.get("http://www.baidu.com")
Demo = response.text
soup = BeautifulSoup(Demo, "html.parser")
for link in soup.find_all('a'):
print(link.get('href'))
运行结果:
http://news.baidu.com
http://www.hao123.com
http://map.baidu.com
http://v.baidu.com
http://tieba.baidu.com
http://www.baidu.com/bdorz/login.giflogin&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1
//www.baidu.com/more/
http://home.baidu.com
http://ir.baidu.com
http://www.baidu.com/duty/
http://jianyi.baidu.com/
Process finished with exit code 0
四、基于bs4库的HTML内容查找方法
<>.find_all(name, attrs, recursive, string, **kwargs)
返回一个列表类型,存储查找的结果
1、name : 对标签名称的检索字符串
2、attrs: 对标签属性值的检索字符串,可标注属性检索
3、recursive: 是否对子孙全部检索,默认True
4、string: <>…</>中字符串区域的检索字符串
import requests
from bs4 import BeautifulSoup
response = requests.get("http://www.baidu.com")
demo = response.text
soup = BeautifulSoup(demo, 'html.parser')
print(soup.find_all('a'))
for tag in soup.find_all(True):
print(tag.name)
for tag in soup.find_all(re.compile('a')):
print(tag.name)
#attrs: 对标签属性值的检索字符串,可标注属性检索
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
print(soup.find_all('a','mnav'))
print(soup.find_all(id = 'link'))
print(soup.find_all(id = re.compile('link')))
#recursive: 是否对子孙全部检索,默认True
print(soup.find_all('a', recursive=False))
#string: <>…</>中字符串区域的检索字符串
print(soup.find_all(string = '新闻'))
print(soup.find_all(string = re.compile('百度')))
扩展方法
方法 | 说明 |
---|---|
<>.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()参数 |