我试图从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]
结果列表'是不正确的。有人可以证实这一点并解释原因吗?
答案 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
。