2016-09-20 64 views
0

我想檢索cityname和citycode並將其存儲在一個字符串變量中。圖像顯示的精確位置:Scrapy SgmlLinkExtractor如何定義XPath

enter image description here

谷歌瀏覽器給了我以下XPath:

//*[@id="page"]/main/div[4]/div[2]/div[1]/div/div/div[1]/div[2]/div/div[1]/div/a[1]/span 

所以我在scrapy定義了以下語句來獲得所需的信息:

plz = response.xpath('//*[@id="page"]/main/div[4]/div[2]/div[1]/div/div/div[1]/div[2]/div/div[1]/div/a[1]/span/text()').extract() 

但是我沒有成功,字符串仍然是空的。我應該使用什麼XPath定義?

+0

你能提供你正在試圖抓取的鏈接嗎?在頁面加載後,城市值可能會被javascript提取。 – jatinderjit

+0

http://www.homegate.ch/kaufen/106015544 – hjschmid

+0

看起來好像城市價值是以某種方式嵌入到href標記中的...... – hjschmid

回答

1

發生這種情況大多是因爲瀏覽器更正了無效的HTML。你如何解決這個問題?檢查(原始)HTML源代碼並編寫自己的XPath,以最短/最簡單的查詢導航DOM。

我從網上刮掉了很多數據,我從來沒有像使用過瀏覽器那樣使用XPath。這是由於幾個原因:

  1. 它將在無效的HTML或最基本的層次結構更改上快速失敗。
  2. 它不包含用於調試網站更改時的問題的標識數據。
  3. 它的方式比它應該更長。

下面是一個例如(有很多不同的XPath查詢,你可以寫找到這個數據,我建議你學習並重新編寫此查詢所以有XPath查詢共同的主題對於各地抓住這個元素項目)查詢:

//div[contains(@class, "detail-address")]//h2/following-sibling::span 

這個問題的另一個主要來源是廣泛依靠JS修改什麼是屏幕上顯示的網站。但方便的是,這將被調試與上面相同。只要你瀏覽頁面加載時返回的HTML,你會注意到你正在查詢的數據在JS執行之前不存在。那時,你需要做一些headless browsing


由於我的回答基本上 「寫自己的XPath」(而不是依賴於瀏覽器),我會留下一些消息來源:

+0

感謝您的回答,不幸的是,我對編碼方面的文盲很少,但不知何故,我設法改變你提出的聲明,使其工作:'/ * [@ class =「h4 title」]/following-sibling :: span/text()' – hjschmid

1

DOM是由javascript操作的,所以chrome顯示的是xpath後 所有的東西都發生了。

如果你想要的是讓城市中,你可以得到它這種方式(使用scrapy):

city_text = response.css('.detail-address span::text').extract_first() 
city_code, city_name = city_text.split(maxsplit=1) 

或者你可以操縱CDATA的JSON得到你需要的所有數據:

cdata_text = response.xpath('//*[@id="tdakv"]/text()').extract_first() 
json_str = cdata_text.splitlines()[2] 
json_str = json_str[json_str.find('{'):] 
data = json.loads(json_str)    # import json 
city_code = data['kvzip'] 
city_name = data['kvplace'] 
+0

我得到一個TypeError通過使用拆分方法:「拆分()沒有關鍵字參數」 – hjschmid

+0

我只是省略了參數「maxsplit = 1」,它的工作,謝謝你... – hjschmid

+0

如果城市名稱本身包含空格,將會導致錯誤'maxsplit' 。但如果你確定不會有任何問題,請繼續... – jatinderjit