信息標(biāo)記、組織和提取
信息在傳遞和應(yīng)用過(guò)程中常常會(huì)給不同意義的信息打上標(biāo)記再按照一定的結(jié)構(gòu)對(duì)信息進(jìn)行組織漏麦,以便后期解析和應(yīng)用客税。在計(jì)算機(jī)程序中有三種較為常用的信息標(biāo)記形式:XML(尖括號(hào))、JSON(有類(lèi)型鍵值對(duì))撕贞、YAML(無(wú)類(lèi)型鍵值對(duì))更耻,其分別適用于因特網(wǎng)信息傳遞、節(jié)點(diǎn)信息通信和系統(tǒng)配置文件捏膨。信息提取是與信息標(biāo)記對(duì)應(yīng)存在的秧均,信息提取可以通過(guò)標(biāo)記解析器完整解析信息的組織結(jié)構(gòu)在提取關(guān)鍵信息,或者將信息看成文本直接搜索關(guān)鍵字(一般是將這兩種方式綜合使用)脊奋。
HTML作為XML標(biāo)記格式中的子格式應(yīng)用在網(wǎng)頁(yè)信息組織中熬北,可以使用beautifulsoup4庫(kù)(bs4)的BeautifulSoup類(lèi)來(lái)解析網(wǎng)頁(yè)結(jié)構(gòu)樹(shù)并調(diào)用find方法來(lái)獲取關(guān)鍵內(nèi)容疙描。
beautifulsoup4庫(kù)
beautifulsoup4庫(kù)是遍歷诚隙、解析、維護(hù)“標(biāo)簽樹(shù)”的功能庫(kù)起胰。
在應(yīng)用bs4庫(kù)的功能時(shí)基本都是構(gòu)建BeautifulSoup類(lèi)映射標(biāo)簽樹(shù)并調(diào)用類(lèi)函數(shù)來(lái)進(jìn)行解析久又,該類(lèi)的基本元素如下:
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))
標(biāo)簽樹(shù)的遍歷和查找
bs4基于標(biāo)簽樹(shù)結(jié)構(gòu)即DOM結(jié)構(gòu)對(duì)標(biāo)簽進(jìn)行遍歷查找,可以用prettify()函數(shù)對(duì)標(biāo)簽樹(shù)進(jìn)行格式化查看效五,遍歷包含有上行遍歷地消、平行遍歷和下行遍歷三種遍歷方式。
import requests
from bs4 import BeautifulSoup
r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
# 格式化標(biāo)簽樹(shù)
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格式下進(jìn)行信息提取可以采用融合提取的方式畏妖,先用bs4庫(kù)對(duì)結(jié)構(gòu)樹(shù)進(jìn)行解析成索引結(jié)構(gòu)脉执,然后采用正則化表達(dá)式作為搜索的模板針對(duì)標(biāo)簽進(jìn)行條件搜索,達(dá)到快速有效的目的戒劫。
# 查找p標(biāo)簽
soup.find_all('p')
# 查找class屬性為title的p標(biāo)簽
soup.find_all('p','title')
# 查找id屬性(特定屬性)為link1的a標(biāo)簽
soup.find_all('a',id = 'link2')
# 利用正則表達(dá)式構(gòu)建文本模板來(lái)作為文本或者屬性的匹配值
import re
soup.find_all(string = re.compile('python'))
soup.find_all(id = re.compile('link'))