Scrapy中詭異xpath的匹配內容失效問題及解決
引言
在爬蟲的世界裡,xpath是一種非常簡單易用的匹配規則,方便我們在web世界裡提取需要的各類信息。
本文將講述一個xpath規則無效的問題分析過程。
環境介紹
Python 3.6.1 Scrapy 1.5.0
問題
在選用xpath之時,都是基於firefox或者chrome中自帶的Web開發工具來選取的。
這裡一般推薦使用chrome的devtool,功能強大,簡單易用,童叟無欺,居傢旅遊必須良品呀。
具體示意如下:
基於xpath提取信息
基於xpath提取的路徑信息,示例如下:
//*[@id=”SpanPlanSchoolInfo”]/table[2]/tbody/tr[3]/td/table/tbody/tr[2]/td[1]/a
在Scrapy代碼中使用如下:
def parse(self, response): xpath_url = '//*[@id="SpanPlanSchoolInfo"]/table[2]/tbody/tr[3]/td/table/tbody/tr[2]/td[1]/a' urls = response.xpath(xpath_url) .....
但是在實際執行中,卻一直沒有匹配到urls,根據實際上頁面返回正常,同時數據也是正確可以匹配到的,那問題出現在哪裡呢?
問題分析
根據結果來分析,如果頁面存在,但是沒有正確的結果輸出,則一定是xpath的問題,但是xpath問題是基於chrome自帶的devtools工具copy而來的,怎麼可能出錯恩?真是讓人想不透的問題…….
在經過一番深入的反復嘗試之後,主要是基於scrapy提供的強大的scrapy shell交互工具,可以幫助開發者快速地一步一步地定位問題。
於是采取瞭逐步縮小xpath的方式,逐步定位問題,終於找到瞭問題的原因所在,那就是tbody是一個需要移除的tag標簽。
將正確的xpath設置為:
//*[@id=”SpanPlanSchoolInfo”]/table[2]/tr[3]/td/table/tbody/tr[2]/td[1]/a
問題總結
雖然問題解決瞭,但是原因是什麼呢?
經過分析,主要是由於瀏覽器本身自動為table新增瞭tbody標簽內容,但是在xpath中是不需要的,需要在進行xpath查詢之時移除掉。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Scrapy元素選擇器Xpath用法匯總
- python爬蟲scrapy基本使用超詳細教程
- python Scrapy框架原理解析
- 一文讀懂python Scrapy爬蟲框架
- python scrapy簡單模擬登錄的代碼分析