信息标记、组织和提取
信息在传递和应用过程中常常会给不同意义的信息打上标记再按照一定的结构对信息进行组织,以便后期解析和应用。在计算机程序中有三种较为常用的信息标记形式:XML(尖括号)、JSON(有类型键值对)、YAML(无类型键值对),其分别适用于因特网信息传递、节点信息通信和系统配置文件。信息提取是与信息标记对应存在的,信息提取可以通过标记解析器完整解析信息的组织结构在提取关键信息,或者将信息看成文本直接搜索关键字(一般是将这两种方式综合使用)。
HTML作为XML标记格式中的子格式应用在网页信息组织中,可以使用beautifulsoup4库(bs4)的BeautifulSoup类来解析网页结构树并调用find方法来获取关键内容。
beautifulsoup4库
beautifulsoup4库是遍历、解析、维护“标签树”的功能库。
beautifulsoup4库
在应用bs4库的功能时基本都是构建BeautifulSoup类映射标签树并调用类函数来进行解析,该类的基本元素如下:
BeautifulSoup类基本元素
newsoup = BeautifulSoup("<b class = 'shuxing' id='s'><!--this is a comment--></b><p>This is not a comment</p>")
print(newsoup.b.name)
print(newsoup.b.attrs)
# NavigableString
print(type(newsoup.p.string))
# Comment
print(type(newsoup.b.string))
标签树的遍历和查找
bs4基于标签树结构即DOM结构对标签进行遍历查找,可以用prettify()函数对标签树进行格式化查看,遍历包含有上行遍历、平行遍历和下行遍历三种遍历方式。
上行遍历
平行遍历
上行遍历
import requests
from bs4 import BeautifulSoup
r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
# 格式化标签树
print(soup.prettify())
# 上行遍历
for parent in soup.a.parents:
print(parent)
# 平行遍历
print(soup.a.next_sibling)
print(soup.a.previous_sibling)
for sibling in soup.a.next_siblings:
print(sibling)
# 下行遍历
for child in soup.body.children:
print(child)
for descendants in soup.body.descendants:
print(descendants)
在HTML格式下进行信息提取可以采用融合提取的方式,先用bs4库对结构树进行解析成索引结构,然后采用正则化表达式作为搜索的模板针对标签进行条件搜索,达到快速有效的目的。
# 查找p标签
soup.find_all('p')
# 查找class属性为title的p标签
soup.find_all('p','title')
# 查找id属性(特定属性)为link1的a标签
soup.find_all('a',id = 'link2')
# 利用正则表达式构建文本模板来作为文本或者属性的匹配值
import re
soup.find_all(string = re.compile('python'))
soup.find_all(id = re.compile('link'))
网友评论