此系列筆記來(lái)源于
中國(guó)大學(xué)MOOC-北京理工大學(xué)-嵩天老師的Python系列課程
4. Beautiful Soup庫(kù)入門(mén)
Beautiful Soup庫(kù)可對(duì)HTML/XML格式進(jìn)行解析并提取相關(guān)信息
- 安裝:管理員方式打開(kāi)CMD-輸入
pip install beautifulsoup4
小測(cè):
獲得鏈接的HTML代碼內(nèi)容
使用beautifulsoup解析 - Beautiful Soup庫(kù)的基本元素
Beautiful Soup庫(kù)是解析/遍歷/維護(hù)"標(biāo)簽熟"的功能庫(kù),引用方式:
from bs4 import BeautifulSoup
import bs4
Beautiful Soup庫(kù)的4種解析器:
Beautiful Soup類(lèi)的基本元素:
bs類(lèi)基本元素 -
Tag標(biāo)簽
任何存在于HTML語(yǔ)法中的標(biāo)簽都可用**soup.<tag>訪問(wèn)獲得,存在多個(gè)取第一個(gè)
-
Tag的name
每個(gè)<tag>有自己的名字,通過(guò)<tag>.name獲取,字符串類(lèi)型
-
Tag的attrs
-
Tag的NavigableString
-
Tag的Comment
-
基于bs4庫(kù)的HTML內(nèi)容遍歷方法
三種遍歷方式-
下行遍歷
屬性
遍歷 -
上行遍歷
屬性
遍歷 -
平行遍歷
屬性
遍歷
-
- 基于bs4庫(kù)的HTML格式輸出
使用prettify()方法,為HTML文本<>及其內(nèi)容增加''\n'并且可用于標(biāo)簽/方法
5.信息組織與提取方法
- 信息標(biāo)記的三種形式及比較
XML(eXtensible Markup Language)是最早的通用信息標(biāo)記語(yǔ)言,可擴(kuò)展性好,但繁瑣;標(biāo)簽由名字和屬性構(gòu)成,形式有:
<name>...</name>
<name />
<!-- -->
JSON(JavaScript Objection Notation)適合程序處理,較XML簡(jiǎn)潔;有類(lèi)型的鍵值對(duì),形式有:
"key":"value"
"key":["value1","value2"]
"key":{"subkey":"subvalue"}
YAML(YAML Ain't Markup Language)文本信息比例最高,可讀性好;無(wú)類(lèi)型的鍵值對(duì),形式有:
key:value
key:#Comment
-value1
-value2
key:
subkey:subvalue
- 信息提取的一般方法
- 完整解析信息的標(biāo)記形式再提取關(guān)鍵信息,需要標(biāo)記解析器;優(yōu)點(diǎn)是解析準(zhǔn)確,缺點(diǎn)是提取繁瑣且慢
- 無(wú)視標(biāo)記形式,直接搜索關(guān)鍵信息;優(yōu)點(diǎn)是提取速度快,缺點(diǎn)是準(zhǔn)確性與信息內(nèi)容相關(guān)
- 結(jié)合兩種方法,需要標(biāo)記解析器和文本搜索功能
- 基于bs4庫(kù)的HTML內(nèi)容查找方法
<>.find_all(name,attrs,recursive,string,**kwargs)`
#返回一個(gè)列表類(lèi)型,存儲(chǔ)查找的結(jié)果
#name:對(duì)標(biāo)簽名稱(chēng)的檢索字符串
#attrs:對(duì)標(biāo)簽屬性值的檢索字符串,可標(biāo)注屬性檢索
#recursive:是否對(duì)子孫全部搜索,默認(rèn)True
#string:對(duì)字符串域進(jìn)行檢索
由find_all()擴(kuò)展的七個(gè)方法:

擴(kuò)展方法
6.實(shí)例一:中國(guó)大學(xué)排名爬蟲(chóng)
步驟1:從網(wǎng)絡(luò)上獲取大學(xué)排名網(wǎng)頁(yè)內(nèi)容getHTMLText()
步驟2:提取網(wǎng)頁(yè)內(nèi)容中信息到合適的數(shù)據(jù)結(jié)構(gòu)fillUnivList()
步驟3:利用數(shù)據(jù)結(jié)構(gòu)展示并輸出結(jié)果printUnivLise()
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return "error"
def fillUnivList(ulist,html):
soup=BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUnivList(ulist,num):
tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","學(xué)校名稱(chēng)","總分",chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)
main()















