在http://www.apkmirror.com/apk/airbnb-inc/airbnb/的Scrapy shell中,我正在尝试提取与AirBnB应用程序的各种版本相对应的链接:
正如使用Chrome的Inspect所看到的,这个元素的结构是:
listWidget
的班级appRow
的孩子包含我想要提取的链接。所以,我想首先选择“包含listWidget
类的元素,其中包含一个包含”所有版本“文本的元素。
到目前为止,我已经提出了
In [4]: response.css('.listWidget').xpath('.//*[contains(text(), "All versions")]').extract()
Out[4]: [u'<div class="widgetHeader">All versions </div>']
然而,这个选择器“太过分了”:我想选择包含这个元素的listWidget
,而不是元素本身。我怎么能实现这个目标?
答案 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('.downloadLink').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/']