scrapy regexp for sitemap_follow

时间:2017-07-14 06:40:12

标签: python scrapy

如果您的sitemap.xml包含:

abc.com/sitemap-1.xml
abc.com/sitemap-2.xml
abc.com/image-sitemap.xml

我如何编写sitemap_follow来只读取sitemap-xxx站点地图而不是image-sitemap.xml? 我试过

^sitemap
没有运气。我该怎么办?否定“形象”?怎么样?

编辑: Scrapy代码:

self._follow = [regex(x) for x in self.sitemap_follow]

if any(x.search(loc) for x in self._follow):

正则表达式应用于整个网址。我在没有修改Scrapy的情况下看到解决方案的唯一方法是为abc.com添加一个Scraper并将其添加到正则表达式或者只是将/添加到正则表达式

1 个答案:

答案 0 :(得分:1)

要天真地直接回答你的问题,我提供此代码。换句话说,我可以使用正则表达式^.$匹配站点地图索引文件中的每个项目。

>>> import re
>>> sitemap_index_file_content = [
... 'abc.com/sitemap-1.xml',
... 'abc.com/sitemap-2.xml',
... 'abc.com/image-sitemap.xml'
... ]
>>> for s in sitemap_index_file_content:
...     m = re.match(r'^.*$', s)
...     if m:
...         m.group()
... 
'abc.com/sitemap-1.xml'
'abc.com/sitemap-2.xml'
'abc.com/image-sitemap.xml'

这意味着您可以通过以下方式设置sitemap_follow,因为the spiders documentation表示此变量需要接收列表。

>>> sitemap_follow = ['^.$']

但是,同一页文档说明了,'默认情况下,会遵循所有站点地图。'因此,这似乎完全没必要。

我想知道你要做什么。

编辑:回应评论。您可以使用所谓的“负面后瞻断言”进行此操作,在这种情况下,(?<!image-)。我对此的保留是,您需要能够在URL的开头扫描诸如abc.com之类的内容,这可能会带来非常有趣的挑战。

>>> for s in sitemap_index_file_content:
...     m = re.match(r'[^\/]*\/(?<!image-)sitemap.*', s)
...     if m:
...         m.group()
... 
'abc.com/sitemap-1.xml'
'abc.com/sitemap-2.xml'