为什么scrapy xpath函数不支持'matches()'语法?

c7rzv4ha  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(280)

我在用0.20.2的小子弹。

$ scrapy shell "http://newyork.craigslist.org/ata/"

我想让所有链接到广告网页的列表设置分开index.html

$ sel.xpath('//a[contains(@href,html)]')
... 
<Selector xpath='//a[contains(@href,"html")]' data=u'<a href="/mnh/atq/4243973984.html">Wicke'>,
<Selector xpath='//a[contains(@href,"html")]' data=u'<a href="/mnh/atd/4257230057.html" class'>,
<Selector xpath='//a[contains(@href,"html")]' data=u'<a href="/mnh/atd/4257230057.html">Recla'>,
<Selector xpath='//a[contains(@href,"html")]' data=u'<a href="/ata/index100.html" class="butt'>]

我想使用XPathmatches()函数来匹配[0-9]+.html正则表达式形式的链接。

$ sel.xpath('//a[matches(@href,"[0-9]+.html")]')
...
ValueError: Invalid XPath: //a[matches(@href,"[0-9]+.html")]

你怎么了?

xesrikrc

xesrikrc1#

matches是一个XPath 2.0函数,而scrapy只支持XPath 1.0(它没有内置任何正则表达式支持)。您必须使用scrapy选择器提取 all 链接,然后在Python级别而不是在XPath中进行正则表达式过滤。

rjee0c15

rjee0c152#

对于此特殊用例,有一个使用translate(...)的XPath 1.0解决方法:

//a[
  translate(substring-before(@href, '.html'), '0123456789', '') = ''
  and @href != '.html'
  and substring-after(@href, '.html') = '']

translate(...)调用删除扩展名.html之前的所有数字。第二行检查确保.html被排除(点之前没有任何内容),最后一行检查确保.html实际上是文件扩展名。

相关问题