【发布时间】:2017-07-18 14:28:20
【问题描述】:
在网站http://www.apkmirror.com/apk/opera-software-asa/opera-mini/opera-mini-28-0-2254-119213-release/opera-mini-fast-web-browser-28-0-2254-119213-2-android-apk-download/ 上,我尝试使用Item Loaders 从同一个XPath 选择器中提取几个字段。为避免代码重复,我想使用nested_xpath 方法。
为此,我想要一个相对 XPath 选择器,它本质上是一个“无操作”并返回输入选择。我以为应该是.//*,但这似乎不起作用。
如果我启动 Scrapy shell
scrapy shell http://www.apkmirror.com/apk/opera-software-asa/opera-mini/opera-mini-28-0-2254-119213-release/opera-mini-fast-web-browser-28-0-2254-119213-2-android-apk-download/ -s USER_AGENT=Mozilla
那么下面的 XPath 表达式给了我想要的结果:
In [2]: response.xpath('//*[@title="APK details"]/following-sibling::*//text()')
...: .extract()
Out[2]:
['Version: 28.0.2254.119213 (281119213)',
'arm ',
'Package: com.opera.mini.native',
'\n',
'183 downloads ']
但是,如果我尝试将其与 .xpath('.//*') 连接,结果将变为一个空列表:
In [3]: response.xpath('//*[@title="APK details"]/following-sibling::*//text()')
...: .xpath('.//*').extract()
Out[3]: []
在这种情况下,正确的“无操作”XPath 选择器是什么?
【问题讨论】:
-
我不明白您所说的 “no-op XPath 选择器”是什么意思。您可以使用项目加载器和nested_xpath 与一些示例 HTML 和预期输出共享一些代码吗?
-
@KurtPeek 嗯。也许您可以将
text()移动到链接的xpath,就像response.xpath('//*[@title="APK details"]/following-sibling::*').xpath('.//text()').extract() -
注意:使用 lxml(和扩展的 Scrapy),文本节点不能进一步应用 XPath 表达式。这是一个限制(或错误)。所以
response.xpath('....//text()').xpath('./some/xpath')总是会给出一个空的结果。