Python網(wǎng)絡(luò)爬蟲(chóng)與信息提取(二):網(wǎng)絡(luò)爬蟲(chóng)之提取

此系列筆記來(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容