Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Scrapy中,如何根据链接的URL与正则表达式的匹配进行选择_Python_Xpath_Scrapy - Fatal编程技术网

Python 在Scrapy中,如何根据链接的URL与正则表达式的匹配进行选择

Python 在Scrapy中,如何根据链接的URL与正则表达式的匹配进行选择,python,xpath,scrapy,Python,Xpath,Scrapy,我正在尝试以可靠的方式刮取下载页面 我已经从命令行用 scrapy shell http://www.apkmirror.com/apk/shareit-technologies-co-ltd/shareit-connect-transfer/shareit-3-0-38_ww-release/shareit-3-0-38_ww-android-apk-download/ 我目前正试图从顶部导航栏中删除开发者名称、应用程序名称和版本名称: 在本案例中,分别为“SHAREit Technolo

我正在尝试以可靠的方式刮取下载页面

我已经从命令行用

scrapy shell http://www.apkmirror.com/apk/shareit-technologies-co-ltd/shareit-connect-transfer/shareit-3-0-38_ww-release/shareit-3-0-38_ww-android-apk-download/
我目前正试图从顶部导航栏中删除开发者名称、应用程序名称和版本名称:

在本案例中,分别为“SHAREit Technologies Co.Ltd”、“SHAREit-转让与股份”和“3.0.38_ww”

到目前为止,我为开发人员名称提供了以下XPath表达式:

In [84]: response.xpath('//*[@class="site-header-contents"]//nav//a/text()').extract()[0]
Out[84]: u'SHAREit Technologies Co.Ltd'
对于应用程序和版本名称,我将分别用
[1]
[2]
替换
[0]
。问题在于,使用数值指标并不被认为是良好的刮削实践

相反,我想在这些链接之间使用“真正”的区别功能:它们的URL包含不同数量的斜杠(
/
)。我想定义一个自定义选择器,将
a/@href
与正则表达式匹配,如果匹配,则返回
a/text()
,但我不知道如何执行此操作。(例如,
re
方法()似乎可用作
extract()
的替代品,但不能“帮助”选择过程)


如何根据应用于
@href
s的自定义函数进行选择?

首先,如果您从面包屑中提取数据,在这种情况下,这不一定是一种不好的做法。您可以保证面包屑订单始终是相同的-第一项是公司,第二项是产品,最后一项是版本-非常可预测
尽管如此,您可能还是希望使用更可靠的xpath索引:

"//div/a[1]" 
# would get first <a> node under <div>
"//div/a[last()]"
# would get last <a> node under <div>
查找包含一些不区分文本的正则表达式匹配项的
节点:

"//div[re:test(.//text(), 'foo.bar', 'i')]"

首先,在这种情况下,如果您从面包屑中提取数据,那么这不一定是一种不好的做法。您可以保证面包屑订单始终是相同的-第一项是公司,第二项是产品,最后一项是版本-非常可预测
尽管如此,您可能还是希望使用更可靠的xpath索引:

"//div/a[1]" 
# would get first <a> node under <div>
"//div/a[last()]"
# would get last <a> node under <div>
查找包含一些不区分文本的正则表达式匹配项的
节点:

"//div[re:test(.//text(), 'foo.bar', 'i')]"