上一篇帶你幹了碗bs湯,不知道你有沒有想換個口味嘗試嘗試采集其他的網頁内容呢?這次我就帶你來采集一下不同味道的bs湯!來一碗串燒湯!
一個網頁中包含了許多内容,上一篇我們已經講到如何透過tag查詢并抓取所需的網頁内容,這次我們将以更高的視角——導航樹,來看待透過tag尋找并抓取内容的過程。
這是書中給出的執行個體連結
在這個網頁中,有着這樣的導航樹:
這種導航樹對我們的爬取工作極為有利,因為這使得我們可以一步一步地縮小範圍深度查找我們所需的内容
對比這兩張圖檔可以知道,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等商品标簽))
執行這段代碼,得到如下結果:
(樣圖未完整展現結果)
值得注意的是,第一個tr是不被包含在内的,因為自己不能是自己的兄弟!!!
講完兄弟标簽,我們再來看看自标簽與後代标簽:
在執行個體網頁中,以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)
就能擷取所有後代标簽内容(在本例中沒啥太大差别)
這一篇到這裡結束了,一定要自己動手敲代碼,并檢視原網頁結構,才能有更深的了解與領悟哦~