天天看點

在Scrapy中如何利用Xpath選擇器從HTML中提取目标資訊(兩種方式)

前一陣子我們介紹了如何啟動Scrapy項目以及關于Scrapy爬蟲的一些小技巧介紹,沒來得及上車的小夥伴可以戳這些文章:

手把手教你如何建立scrapy爬蟲架構的第一個項目(上)

手把手教你如何建立scrapy爬蟲架構的第一個項目(下)

關于Scrapy爬蟲項目運作和調試的小技巧(上篇)

關于Scrapy爬蟲項目運作和調試的小技巧(下篇)

今天我們将介紹在Scrapy中如何利用Xpath選擇器從HTML中提取目标資訊。在Scrapy中,其提供了兩種資料提取的方式,一種是Xpath選擇器,一種是CSS選擇器,這一講我們先聚焦Xpath選擇器,仍然是以伯樂線上網為示例網站。

1、 打開網站,然後随機選擇任意一篇文章進行檢視,如下圖所示。

我們需要提取的資訊主要有标題、日期、主題、評論數、正文等等。

2、接下來我們就可以開始寫代碼了,基礎代碼如下圖所示,需要注意的是start_urls參數值改為了具體的URL,其他的代碼未發生改變。

3、回到原始網頁,按下鍵盤的快捷鍵F12或者在網頁上點選滑鼠右鍵,然後選擇“檢查(N)”彈出網頁的調試界面,如下圖所示。

4、點選下圖中紅色框框的小圖示,可以實作網頁資料和源碼之間的互動,可以很友善的幫助我們定位标簽。

5、如下圖所示,當我們選擇上圖中的小圖示之後,再選擇網頁上的标題,爾後網頁源碼會自動跳轉到我們定位的部分,可以看到标題在标簽下。

6、爾後我們就可以根據上圖中的網頁層次結構寫出标題的Xpath表達式,這裡先提供一種比較笨的方法,從頭到尾進行羅列的寫,“/html/body/div[1]/div[3]/div[1]/div[1]/h1”,有沒有發現灰常的辛苦,像這種大标題資訊還比較好提取一些,若是碰到犄角旮旯的資訊,就比較難寫表達式了,而且這種方式容易出錯,效率還低。不過小夥伴們不用灰心,浏覽器給我們提供了一個便捷的方式,讓我們可以直接複制Xpath表達式。在标題處或者目标資訊處右鍵,然後選擇“Copy”,再選擇“Copy Xpath”即可進行複制該标簽的Xpath表達式,具體過程如下圖所示。

可以看到複制的Xpath表達式為“//*[@id="post-113659"]/div[1]/h1”,其中id="post-113659"是屬于這篇文章的一個辨別,如下圖所示。

通過該辨別我們就可以很快的定位到标簽,其與我們用笨方法手動寫出來的Xpath表達式有時候并不是一緻的。下面将兩個Xpath表達式所比對的内容分别進行輸出。

7、将Xpath表達式寫入Scrapy爬蟲主體檔案中,爾後Debug我們之前定義的main.py檔案,将會得到下圖的輸出。可以看到selector1和selector2中的資料即是網頁上的内容,而且内容是一緻的。

之後點選停止Debug模式,便可以退出Debug模式。

8、從上圖中我們可以看到選擇器将标簽

也都取出來了,而我們想要取的内容僅僅是标簽内部的資料,此時隻需要使用在Xpath表達式後邊加入text()函數,便可以将其中的資料進行取出。

通過這篇文章,我們可以了解到盡管我們自己寫出的Xpath表達式和浏覽器給我們傳回的Xpath表達式在寫法上并不一緻,但是程式運作之後,其傳回的資料内容是一緻的。換句話說,關于某個目标資料的Xpath表達式并不是唯一的,隻要符合Xpath表達式文法,即便是寫的很短,也是沒問題的,你開心就好。此外在Scrapy爬蟲架構中,text()函數常常與Xpath表達式運用在一塊,用于提取節點中的資料内容。