2017-05-08 48 views
1

在Scrapy殼爲http://www.apkmirror.com/apk/airbnb-inc/airbnb/的元件的某些類的元素,我試圖提取對應於製作的Airbnb應用程序的不同版本的鏈接:CSS/Xpath的選擇器,用於用含有某些文本

enter image description here

由於使用Chrome的檢查看到,這個元素的結構是:

enter image description here

與類的listWidget的孩子包含我想要提取的鏈接。所以,我想先選擇「帶有類listWidget的元素,其中包含一個包含文本」所有版本「的元素。」

到目前爲止,我想出了

In [4]: response.css('.listWidget').xpath('.//*[contains(text(), "All versions")]').extract() 
Out[4]: [u'<div class="widgetHeader">All versions </div>'] 

然而,這個選擇變爲「太遠」:我想選擇listWidget包含此元素,而不是元素本身。我該如何做到這一點?

回答

2

您可以嘗試使用下面XPath表達:

.//div[div[text()="All versions "]] 

這將匹配div包含divtext"All versions "

+0

這似乎做什麼,我問:在我的Scrapy殼,如果我嘗試'response.xpath( '.// DIV [DIV [文本()= 「所有版本」]]')提取物() '',我得到'[''

\n
All versions
\ n
']',這是'div'用給定的文字包圍'div'。 (它不包含'appRow' div,但是這是因爲我問了一個錯誤的問題:我實際上對'div'的兩個層次感興趣)。 –

+1

如果你想匹配'appRow',你可能需要嘗試'.//div[div[text()="All versions「]]/following-sibling :: div [@ class =」appRow「]' – Andersson

+0

Yes ,我最終使用了這種方法,並使用CSS選擇器代替Xpath選擇器來選擇遵循Scrapy推薦實踐的類(https://doc.scrapy.org/zh/latest/topics/selectors.html#when-querying-by )使用CSS的-class-考慮 - 。我用來獲得三個鏈接的最後一個表達式是'response.xpath('.//* [* [contains(text(),「All versions」)]]/following-sibling :: *')。css(' .appRow ')。CSS('。downloadLink ')。的xpath(' .//@ HREF')。提取物()'。 –

1

還有的XPath's contains()在Scrapy一個CSS版本(事實上,it's in cssselect) 。

從OP的評論in @Andersson's answer

最終的表達經常拿這三個環節是

response.xpath('.//*[*[contains(text(), "All versions")]]/following-sibling::*').css('.appRow').css('.dow‌​nloadLink').xpath('.‌​//@href').extract() 

一個可以轉換,爲:

In [6]: response.css(''':contains("All versions") ~ .appRow 
          .downloadLink::attr(href)''').extract() 

這輸出:

Out[6]: 
['/apk/airbnb-inc/airbnb/airbnb-17-14-release/', 
'/apk/airbnb-inc/airbnb/airbnb-17-12-release/', 
'/apk/airbnb-inc/airbnb/airbnb-17-11-release/'] 
相關問題