最近試了下HTML決議,感覺挺有趣的,忙里偷閑爬上來叨叨一下,
要是有大兄弟也想要相關資料的話戳這里,暗號csdn,歡迎來耍,

不講廢話了,下面開始,
面對頁面決議難題(Gordian Knot)的時候,不假思索地直接寫幾行陳述句來抽取資訊是非常直接的做法,但是,像這樣魯莽放縱地使用技術,只會讓程式變得難以除錯或脆弱不堪,甚至二者兼具,在開始決議網頁之前,讓我們看一些在決議復雜的 HTML 頁面時需要避免的問題,
假如你已經確定了目標內容,可能是采集一個名字、一組統計資料,或者一段文字,你的目標內容可能隱藏在一個 HTML“爛泥堆”的第 20 層標簽里,帶有許多沒用的標簽或HTML 屬性,假如你不經考慮地直接寫出下面這樣一行代碼來抽取內容:
bsObj.findAll("table")[4].findAll("tr")[2].find("td").findAll("div")[1].find("a")
雖然也可以達到目標,但這樣看起來并不是很好,除了代碼欠缺美感之外,還有一個問題是,當網站管理員對網站稍作修改之后,這行代碼就會失效,甚至可能會毀掉整個網路爬蟲,那么你應該怎么做呢?
?尋找“列印此頁”的鏈接,或者看看網站有沒有 HTML 樣式更友好的移動版(把自己的請求頭設定成處于移動設備的狀態,然后接收網站移動版,)
?尋找隱藏在 JavaScript 檔案里的資訊,要實作這一點,你可能需要查看網頁加載的JavaScript 檔案,我曾經要把一個網站上的街道地址(以經度和緯度呈現的)整理成格式整潔的陣列時,查看過內嵌谷歌地圖的 JavaScript 檔案,里面有每個地址的標記點,
?雖然網頁標題經常會用到,但是這個資訊也許可以從網頁的 URL 鏈接里獲取,
?如果你要找的資訊只存在于一個網站上,別處沒有,那你確實是運氣不佳,如果不只限于這個網站,那么你可以找找其他資料源,有沒有其他網站也顯示了同樣的資料?網站上顯示的資料是不是從其他網站上抓取后攢出來的?
尤其是在面對埋藏很深或格式不友好的資料時,千萬不要不經思考就寫代碼,一定要三思而后行,
再試試BeautifulSoup
可以通過屬性查找標簽的方法,標簽組的使用,以及標簽決議樹的導航程序,
基本上,你見過的每個網站都會有層疊樣式表(Cascading Style Sheet,CSS),雖然你可能會認為,專門為了讓瀏覽器和人類可以理解網站內容而設計一個展現樣式的層,是一件愚蠢的事,但是 CSS 的發明卻是網路爬蟲的福音,CSS 可以讓 HTML 元素呈現出差異化, 使那些具有完全相同修飾的元素呈現出不同的樣式,比如,有一些標簽看起來是這樣:
<span class="green"></span>
而另一些標簽看起來是這樣:
<span class="red"></span>
網路爬蟲可以通過 class 屬性的值,輕松地區分出兩種不同的標簽,例如,它們可以用BeautifulSoup 抓取網頁上所有的紅色文字,而綠色文字一個都不抓,因為 CSS 通過屬性準確地呈現網站的樣式,所以你大可放心,大多數新式網站上的 class 和 id 屬性資源都非常豐富,
下面讓我們創建一個網路爬蟲來抓取 http://www.pythonscraping.com/pages/warandpeace.html
這個網頁,
在這個頁面里,小說人物的對話內容都是紅色的,人物名稱都是綠色的,你可以看到網頁源代碼里的 span 標簽,參考了對應的 CSS 屬性,如下所示:
"<span class="red">Heavens! what a virulent attack!</span>" replied <span class=
"green">the prince</span>, not in the least disconcerted by this reception.
通過 BeautifulSoup 物件,我們可以用 findAll 函式抽取只包含在 </ span> 標簽里的文字,這樣就會得到一個人物名稱的 Python 串列(findAll 是一個非常靈活的函式,我們后面會經常用到它):
nameList = bsObj.findAll("span", {"class":"green"})
for name in nameList:
print(name.get_text())
代碼執行以后就會按照《戰爭與和平》中的人物出場順序顯示所有的人名,這是怎么實作的呢?之前,我們呼叫 bsObj.tagName 只能獲取頁面中的第一個指定的標簽,現在,我們呼叫 bsObj.findAll(tagName, tagAttributes) 可以獲取頁面中所有指定的標簽,不再只是第一個了,
獲取人名串列之后,程式遍歷串列中所有的名字,然后列印 name.get_text(),就可以把標簽中的內容分開顯示了,
什么時候使用 與什么時候應該保留標簽?
什么時候使用在這里 .get_text()與什么時候應該保留標簽?
.get_text() 會把你正在處理的 HTML 檔案中所有的標簽都清除,然后回傳一個只包含文字的字串,假如你正在處理一個包含許多超鏈接、段落和標簽的大段源代碼,那么 .get_text() 會把這些超鏈接、段落和標簽都清除掉, 只剩下一串不帶標簽的文字,
用 BeautifulSoup 物件查找你想要的信息,比直接在 HTML 文本里查找資訊要簡單得多,通常在你準備列印、存盤和操作資料時,應該最后才使用 .get_text(),一般情況下,你應該盡可能地保留 HTML 檔案的標簽結構,
大概就是這些叨逼叨了,俺這里還有相關的資料,想要的兄弟記得戳這里!這里!,暗號csdn,

都看到這兒,還不點個贊嗎,動動小手指,冬天運動一下啊~
順便求一波關注~

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/226907.html
標籤:其他
上一篇:計算機網路安全C復習
