具有某个类的元素的CSS / Xpath选择器,该类包含具有特定文本的元素

时间:2017-05-08 15:56:02

标签: python css xpath scrapy

http://www.apkmirror.com/apk/airbnb-inc/airbnb/的Scrapy shell中,我正在尝试提取与AirBnB应用程序的各种版本相对应的链接:

enter image description here

正如使用Chrome的Inspect所看到的,这个元素的结构是:

enter image description here

listWidget的班级appRow的孩子包含我想要提取的链接。所以,我想首先选择“包含listWidget类的元素,其中包含一个包含”所有版本“文本的元素。

到目前为止,我已经提出了

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

然而,这个选择器“太过分了”:我想选择包含这个元素的listWidget,而不是元素本身。我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用以下XPath表达式:

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

这会将包含 div的{​​{1}} div text

相匹配

答案 1 :(得分:1)

Scrapy中有XPath's contains()的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/']