【问题标题】:Relative XPath selector for 'everything''everything' 的相对 XPath 选择器
【发布时间】: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') 总是会给出一个空的结果。

标签: python xpath scrapy


【解决方案1】:

Psidompaul trmbrth 的cmets 之后,我终于将text() 移动到了链接的XPath。所以还是有text()的一些代码重复,但是比整个XPath表达式要少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多