在Scrapy中,为什么在Xpath表达式中的text()[n]后跟extract()不等同于extract(),然后选择第[n-1]个元素?

时间:2017-04-26 11:10:34

标签: python xpath scrapy

我试图从http://www.apkmirror.com开始搜索APK下载页面,但我的一些XPath表达式并没有像我预期的那样发挥作用。

例如,在http://www.apkmirror.com/apk/google-inc/maps/maps-9-2-0-9-release/maps-9-2-0-android-4-3-902013124-android-apk-download/的Scrapy shell中,我提取了' APK详细信息'部分如下:

In [1]: response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]//text()').extract()
Out[1]: 
[u'Version: 9.2.0 (902013124)',
 u'arm ',
 u'Package: com.google.android.apps.maps',
 u'\n',
 u'40,353 downloads ']

我想提取支持的体系结构,这种情况在第二行是'arm '。我通过

提取线
In [2]: response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]//text()[2]').extract()
Out[2]: [u'arm ']

到目前为止,这么好,但还有其他页面,例如http://www.apkmirror.com/apk/htc-corporation/htc-backup/htc-backup-4-5-696121-release/htc-backup-4-5-696121-android-apk-download/,其中包含该版本的行不存在。在这种情况下,我得到

In [3]: response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]//text()').extract()
Out[3]: 
[u'Version: 4.5.696121 (454663465) ',
 u'Package: com.htc.backup',
 u'\n',
 u'1,664 downloads ']

奇怪的是,如果我在前面的XPath表达式之后添加[2],我会得到一个空行:

In [2]: response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]//text()[2]').extract()
Out[2]: [u'\n']

这对应于从extract()获得的列表的第三个元素,而我希望它仍然是以Package:开头的第二行。

简而言之,似乎我的假设是在Xpath表达式中包含[n]并调用extract()等同于调用extract()并从中选择[n-1]结果列表'是不正确的。有人可以证实这一点并解释原因吗?

1 个答案:

答案 0 :(得分:3)

以此XML为例:

<r>
  <p id="1">
    <c>text 1</c>
    <c>text 2</c>
    <c>text 3</c>
  </p>
  <p id="2">
    <c>text 4</c>
    <c>text 5</c>
    <c><a>text 6</a><a>text 7</a></c>
  </p>
</r>

//c//text()[1]返回text 1 - 6,因为它们c 下面的第一个文字。

//c//text()[2]会返回text 7,因为它是c 下面唯一的第二个文字。

(//c//text())[2]返回text 2,因为它是所有文本中的第二个c