一镐捧、看官網(wǎng)上說明
“ Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫. 它能夠通過你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航, 查找, 修改文檔的方式. Beautiful Soup會(huì)幫你節(jié)省數(shù)小時(shí)甚至數(shù)天的工作時(shí)間.
“ XPath 是一門在 XML 文檔中查找信息的語言闯睹。XPath 可用來在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷。
XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素硅确,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上。
二护戳、從原理上區(qū)別
BeautifulSoup是一個(gè)第三方的Python庫首懈,BeautifulSoup是用python寫的XPath是一門語言绊率,技術(shù)。xpath是用c寫的
BeautifulSoup和XPath的原理不一樣究履,BeautifulSoup是基于DOM的滤否,會(huì)載入整個(gè)文檔,解析整個(gè)DOM樹最仑,因此時(shí)間和內(nèi)存開銷都會(huì)大很多顽聂。而lxml只會(huì)局部遍歷。
三盯仪、如何使用
xpath 要求一定清楚文檔層次結(jié)構(gòu)紊搪,它通過元素和屬性進(jìn)行導(dǎo)航,可以使用絕對(duì)路徑或相對(duì)路徑查找全景,而beautifulsoup 不必清楚文檔結(jié)構(gòu)耀石,可以直接找某些標(biāo)簽,簡(jiǎn)單粗暴爸黄。
打個(gè)比方滞伟,如果我們要找這個(gè)地址:移動(dòng)互聯(lián)網(wǎng)創(chuàng)新園(上海)
如用正則表達(dá)式的話,是這樣描述的:它是北邊是復(fù)旦軟件園炕贵,門口是高架輕軌線...
如用XPath來描述的話是:它在 上海市 寶山區(qū) 逸仙路 2816號(hào)梆奈。(從大到小,絕對(duì)路徑)
舉栗子說明称开,獲取簡(jiǎn)書首頁的熱門文章:
首先分析一下首頁html文檔結(jié)構(gòu):
分析一下亩钟,我們看到:
- 文章標(biāo)題是包含在h4標(biāo)簽下面的a標(biāo)簽中;
- 每篇文章信息(作者鳖轰,標(biāo)題清酥,閱讀量,喜歡)是在一個(gè)ul標(biāo)簽下蕴侣,有兩種樣式article-list thumbnails 和have-img焰轻,即有縮略圖和無圖
實(shí)現(xiàn):
- BeautifulSoup:
from bs4 import BeautifulSoup #導(dǎo)入庫
#html 是爬取的網(wǎng)頁源代碼, 將一段文檔傳入BeautifulSoup 的構(gòu)造方法,就能得到一個(gè)文檔的對(duì)象
soup = BeautifulSoup(html,'html.parser',from_encoding='utf-8')
#查找所有的h4標(biāo)簽
links = soup.find_all("h4")
for link in links:
print link
- XPath
from lxml import etree
selector = etree.HTML(html)
links = selector.xpath('//h4/a/text()')
for link in links:
print link
可以使用Chrome的審核元素功能來找到我們所需要提取內(nèi)容的xpath
注意:copy出來的path:
//*[@id="list-container"]/ul[2]/li[1]/div/h4/a
是指向一個(gè)指定的內(nèi)容,對(duì)比一下文檔結(jié)構(gòu)昆雀,如果需要提取所有文章信息(需要循環(huán)的部分)辱志,如何修改?
以上兩段代碼都提取到首頁所有文章狞膘,打印輸出的形式也不一樣揩懒,soup.find_all("h4")找到的是包含文章標(biāo)題和鏈接的所有h4標(biāo)簽(包含標(biāo)簽),selector.xpath('//h4/a/text()')找到的是h4標(biāo)簽下a標(biāo)簽中的文字內(nèi)容(text())客冈。