前面我們在寫爬取豆瓣讀書內(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ù)語。

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代碼所涉及到的語法都包含在下面的表格中啦。

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的使用。

我們這里通過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)題。
