2017-04-13 17 views
0

運行下列網站Scrapy外殼呼叫的XPath表達式,在Scrapy,如何巢才/文()

http://www.apkmirror.com/apk/shareit-technologies-co-ltd/shareit-connect-transfer/shareit-3-0-38_ww-release/shareit-3-0-38_ww-android-apk-download/

我試圖讓文字從線這個 'APK細節' 區域:

enter image description here

我對包含文本的div以下選擇:

In [91]: response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]').extract() 
Out[91]: [u'<div class="appspec-value">Version: 3.0.38_ww (4030038)<br>arm <br><span class="wrapText">Package: com.lenovo.anyshare.gps</span>\n<br>2,239 downloads </div>'] 

請注意,帶有「Package:com.lenovo.anyshare.gps」的行位於<span>元素內,而其餘行不是。因此,我想使用這個選擇器兩次:獲得/text()和跨度。爲了避免代碼重複,我想給這個選擇器一個名字,並在稍後與其他人連接。

因此,我試圖在分配名稱

In [95]: apk_details = response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]') 

,但如果我這樣做apk_details.xpath('/text()').extract(),我得到None。我也試過

In [107]: apk_details.xpath('.//*/text()').extract() 
Out[107]: [u'Package: com.lenovo.anyshare.gps'] 

以下Nested Selectors in Scrapy,但是這給了我「包」行,而不是行之前。

我該如何使用簡單的(/text())調用來接下來的選擇器?

+2

你試過'apk_details.xpath('.// text()')。extract()'? – Andersson

+1

Andersson在這裏回答了這個問題 - 「//」是選擇節點的任何後代的符號,反過來,// text()表示任何後代的text()值。因爲xpath不會隔離它的節點(即,您可以從任何節點訪問文檔的任何部分),所以''.''表示您正在從當前節點而不是根節點進行選擇。 – Granitosaurus

回答

0

答案,如Andersson給出確認,並通過Granitosaurus解釋,是

In [109]: apk_details.xpath('.//text()').extract() 
Out[109]: 
[u'Version: 3.0.38_ww (4030038)', 
u'arm ', 
u'Package: com.lenovo.anyshare.gps', 
u'\n', 
u'2,239 downloads '] 

有趣的是,這包括Package線,儘管這並不包括通過初始的XPath調用/text()表達。這是因爲//是指任何後代,包括<span>元素。不過,這實際上是我想要的。

0

如果有幫助,請參閱以下行。

In [120]: response.xpath('//[@id="file"]/div[1]/div[1]/div/div[1]/div[2]//text()').extract() 

Out[120]: 
[u'Version: 3.0.38_ww (4030038)', 
u'arm ', 
u'Package: com.lenovo.anyshare.gps', 
u'\n', 
u'2,239 downloads '] 

In [121]: vd=response.xpath('//* 
    [@id="file"]/div[1]/div[1]/div/div[1]/div[2]//text()').extract() 

In [122]: for v in vd: 
    ...:  print v 
    ...:  
Output: 

    Version: 3.0.38_ww (4030038) 
    arm 
    Package: com.lenovo.anyshare.gps 
    2,239 download