1. 程式人生 > >python爬蟲入門--Beautiful Soup庫介紹及例項

python爬蟲入門--Beautiful Soup庫介紹及例項

整理自:北理工嵩天老師的網路課程。

1、Beautiful Soup庫基礎知識

(1)Beautiful Soup庫的理解

Beautiful Soup庫是解析、遍歷、維護“標籤樹”的功能庫。

BeautifulSoup對應一個HTML/XML文件的全部內容。

                            

                

(2)Beautiful Soup庫解析器

(3)BeautifulSoup類的基本元素

a. Tag 標籤.     

任何存在於HTML語法中的標籤都可以用soup.<tag>訪問獲得。

當HTML文件中存在多個相同<tag>對應內容時,soup.<tag>返回第一個。

示例程式碼如下:

b. Tag的name.    

每個<tag>都有自己的名字,通過<tag>.name獲取,字串型別。

示例程式碼如下:

c. Tag的attrs.

一個<tag>可以有0或多個屬性,字典型別

示例程式碼如下:

d. Tag的NavigableString.

NavigableString可以跨越多個層次。

示例程式碼如下:

(4)基於bs4庫的HTML內容遍歷方法

a. HTML基本格式

b. 標籤樹的下行遍歷

遍歷兒子節點:

遍歷子孫節點:

c. 標籤樹的上行遍歷

d. 標籤樹的上行遍歷

總結如下圖:

(5)bs4庫的prettify()方法--讓HTML內容更加“友好”的顯示

prettify()為HTML文字<>及其內容增加更加'\n'

顯示效果如下:

2、資訊標記與提取方法

(1)資訊標記的三種方式

a. XML例項

b. JSON例項

c. YAML例項

三種資訊標記形式的比較:

XML最早的通用資訊標記語言,可擴充套件性好,但繁瑣。Internet上的資訊互動與傳遞。

JSON資訊有型別,適合程式處理(js),較XML簡潔。 移動應用雲端和節點的資訊通訊,無註釋。

YAML資訊無型別,文字資訊比例最高,可讀性好。 各類系統的配置檔案,有註釋易讀。


(2)資訊提取

Beautiful Soup庫提供了<>.find_all()函式,返回一個列表型別,儲存查詢的結果。

詳細介紹如下:

        

示例程式碼如下:

擴充套件方法如下:

3. Beautiful Soup庫例項--&&中文對齊問題的解決

功能描述:

輸入:大學排名URL連結

輸出:大學排名資訊的螢幕輸出(排名,大學名稱,總分)

技術路線:requests‐bs4

定向爬蟲:僅對輸入URL進行爬取,不擴充套件爬取

程式的結構設計:

步驟1:從網路上獲取大學排名網頁內容 getHTMLText()

步驟2:提取網頁內容中資訊到合適的資料結構 fillUnivList()

步驟3:利用資料結構展示並輸出結果 printUnivList()

輸出結果如下:

原始碼如下:

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 ""
 
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') #簡寫,等價於下一行程式碼            
            #tds = tr.find_all('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string,tds[3].string])
 
def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{4}^8}\t{2:6}\t{3:10}"
    print(tplt.format("排名","學校名稱","城市","總分",chr(12288)))
    for i in range(num):
        u=ulist[i]
        print(tplt.format(u[0],u[1],u[2],u[3],chr(12288)))
     
def main():
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20) # 20 univs
main()


中文對齊問題的原因:

當中文字元寬度不夠時,採用西文字元填充;中西文字元佔用寬度不同。

解決方法:

採用中文字元的空格填充chr(12288)