天天看點

【python網絡資料采集】菜式串燒之導航樹

上一篇帶你幹了碗bs湯,不知道你有沒有想換個口味嘗試嘗試采集其他的網頁内容呢?這次我就帶你來采集一下不同味道的bs湯!來一碗串燒湯!

一個網頁中包含了許多内容,上一篇我們已經講到如何透過tag查詢并抓取所需的網頁内容,這次我們将以更高的視角——導航樹,來看待透過tag尋找并抓取内容的過程。

這是書中給出的執行個體連結

在這個網頁中,有着這樣的導航樹:

【python網絡資料采集】菜式串燒之導航樹

這種導航樹對我們的爬取工作極為有利,因為這使得我們可以一步一步地縮小範圍深度查找我們所需的内容

【python網絡資料采集】菜式串燒之導航樹
【python網絡資料采集】菜式串燒之導航樹

對比這兩張圖檔可以知道,item所在行與vegetables所在行屬于“兄弟行”關系,因為它們同在tbody下的tr tag中,且為平行關系(互相不包含且在同一級導航樹)

由此,我們可以調用一個極好用的bs函數:next.siblings來尋找所有“兄弟”

開始下廚:

from urllib.request import urlopen
from bs4 import BeautifulSoup
           
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsobj = BeautifulSoup(html)
           

前期工作準備完畢,接下來是大菜時間:

for sibling in bsobj.find("table",{"id":"giftList"}).tr.next_siblings:
    print(sibling)
           

這段代碼的意思是周遊輸出(bsobj中查找id為giftList的table标簽,在其下找到tr标簽,找到第一個tr(本例中為item)以後的所有tr兄弟标簽(本例中是諸如vegetables等商品标簽))

執行這段代碼,得到如下結果:

【python網絡資料采集】菜式串燒之導航樹

(樣圖未完整展現結果)

值得注意的是,第一個tr是不被包含在内的,因為自己不能是自己的兄弟!!!

講完兄弟标簽,我們再來看看自标簽與後代标簽:

【python網絡資料采集】菜式串燒之導航樹

在執行個體網頁中,以table舉例,其下的tbody即為一個子标簽(children),而tr與td等等隻能算是table的後代标簽(descendants)。

我們執行下面這段代碼:

for child in bsobj.find("table",{"id":"giftList"}).children:
    print(child)
           

便能輸出所有table下的子标簽(tr)内容了

同理,執行下面這段代碼:

for descendant in bsobj.find("table",{"id":"giftList"}).descendants:
    print(descendant)
           

就能擷取所有後代标簽内容(在本例中沒啥太大差别)

這一篇到這裡結束了,一定要自己動手敲代碼,并檢視原網頁結構,才能有更深的了解與領悟哦~