爬蟲課程(八)|豆瓣:十分鐘學(xué)會使用XPath選擇器提取需要的元素值

前面我們在寫爬取豆瓣讀書內(nèi)容示例中提到了XPath,本文就詳細(xì)介紹下在爬蟲中如何使用XPath選擇器,掌握本文中的內(nèi)容,將解決98%在爬蟲中利用XPath提取元素的需求。

一、XPath簡介

XPath 是一門在 XML 或HTML文檔中查找信息的語言。XPath 用于在 XML 和HTML文檔中通過元素和屬性進(jìn)行導(dǎo)航。

什么是 XPath?

XPath 使用路徑表達(dá)式在XML和HTML文檔中進(jìn)行導(dǎo)航。

XPath 包含一個標(biāo)準(zhǔn)函數(shù)庫。

XPath 是一個 W3C 標(biāo)準(zhǔn)。

二、XPath的節(jié)點(diǎn)關(guān)系

節(jié)點(diǎn)(Node)是XPath 的術(shù)語。

(圖一)html

1)父節(jié)點(diǎn)(Parent)

每個元素以及屬性都有一個父。在“(圖一)html”的例子中,book 元素是 title、author、year 以及 price 元素的父。

2)子節(jié)點(diǎn)(Children)

元素節(jié)點(diǎn)可有零個、一個或多個子。在“(圖一)html”的例子中,title、author、year 以及 price 元素都是 book 元素的子。

3)同胞節(jié)點(diǎn)(Sibling)

擁有相同的父的節(jié)點(diǎn)。在“(圖一)html”的例子中,title、author、year 以及 price 元素都是同胞。

4)先輩節(jié)點(diǎn)(Ancestor)

某節(jié)點(diǎn)的父、父的父,等等。在“(圖一)html”的例子中,title 元素的先輩是 book 元素和 bookstore 元素,

5)后代節(jié)點(diǎn)(Descendant)

某個節(jié)點(diǎn)的子,子的子,等等。在“(圖一)html”的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素。

三、XPath的語法

XPath 使用路徑表達(dá)式在 XML 和HTML文檔中選取節(jié)點(diǎn)。節(jié)點(diǎn)是通過沿著路徑或者 step 來選取的。

下面列出了最有用的路徑表達(dá)式,掌握了這些表達(dá)式,可以完成89%的爬蟲提取元素的需求。我們編寫了將近一百個網(wǎng)站的各種各樣的數(shù)據(jù)提取的XPath代碼所涉及到的語法都包含在下面的表格中啦。

XPath表達(dá)式清單

article 選取所有article元素的所有子節(jié)點(diǎn)

/article 選取根元素article

article/a 選取所有屬于article的子元素的a元素

//div/ 選取所有div子元素(不論出現(xiàn)在文檔任何地方)

article//div 選取所有屬于article元素的后代的div元素,不管它出現(xiàn)在article下的任何位置

//@class 選取所有名為class的屬性

/article/div[1] 選取屬于article子元素的第一個div元素

/article/div[last()] 選取屬于article子元素的最后一個div元素

/article/div[last()-1] 選取屬于article子元素的倒數(shù)第二個div元素

//div[@class] 選取所有擁有class屬性的div元素

//div[@class='article'] 選取所有class屬性為article的div元素

//div[@class='article']/text() 選取所有class屬性為article的div元素下的text值

/div/* 選取屬于div元素的所有子節(jié)點(diǎn)

//* 選取所有元素

//div[@*] 選取所有帶屬性的div元素

//div/a|//div/p 選取所有div元素下的a和p元素

//span|//ul 選取文檔中的span和ul元素

article/div/p|//span 選取所有屬于article元素的div元素的p元素以及文檔中所有的span元素

四、使用XPath提取豆瓣讀書書籍標(biāo)題的示例

我們還是以獲取豆瓣讀書的書籍信息為例來說明XPath的使用。

獲取豆瓣讀書的書籍標(biāo)題

我們這里通過3種方法來提取這個書籍的標(biāo)題值。

1)方法一:從html開始一層一層往下找,使用Firefox瀏覽器自帶的復(fù)制XPath功能使用的就是這個方式。

re1_selector = sel.xpath('/html/body/div[3]/div[1]/div/div[2]/ul/li[1]/div/h2/a/text()').extract()[0]

2)方法二:找到特定的id元素,因?yàn)橐粋€網(wǎng)頁中id是唯一的,所以再基于這個id往下找也是可以提取到想要的值,使用Chrome瀏覽器自帶的復(fù)制XPath功能使用的就是這個方式。

re2_selector = sel.xpath('//*[@id="content"]/div/div[2]/ul/li[1]/div/h2/a/text()').extract()[0]

3)方法三:找到特定的其他非id元素,保障這個非id元素在你獲取的規(guī)則中是唯一的,再基于這個非id元素往下找。

re3_selector = sel.xpath('//ul[@class="cover-col-4 clearfix"]/li[1]/div/h2/a/text()').extract()[0]

最后我們執(zhí)行,發(fā)現(xiàn)這3種方法都是可以正確獲取到“百年法”這個書籍標(biāo)題。

3種XPath表達(dá)式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 20170531 這幾天重新拾起了爬蟲,算起來有將近5個月不碰python爬蟲了。 對照著網(wǎng)上的程序和自己以前寫的...
    八神蒼月閱讀 14,377評論 3 44
  • 原文出處: j_hao104 一、選取節(jié)點(diǎn)常用的路勁表達(dá)式:表達(dá)式描述實(shí)例 nodename選取nodenam...
    三兩五閱讀 7,507評論 2 13
  • scrapy提供了兩種提取方法,Xpath和Css。 Xpath用起來覺得好麻煩,有點(diǎn)笨,我還是比較喜歡Css的提...
    阿軻666閱讀 3,702評論 0 4
  • xpath使用路徑表達(dá)式在xml和html中進(jìn)行導(dǎo)航 xpath節(jié)點(diǎn)關(guān)系: 父節(jié)點(diǎn)、子節(jié)點(diǎn)、同胞節(jié)點(diǎn)、先輩節(jié)點(diǎn)、后...
    眼君閱讀 477評論 0 1
  • 小陶的叔叔阿三今年大約五十歲了。 小陶和叔叔阿三是表親,一表五千里的那種,小陶上初中的時候第一次見過這個個子小小臉...
    張大大小小小閱讀 246評論 0 0

友情鏈接更多精彩內(nèi)容