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)