如果您的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并将其添加到正则表达式或者只是将/添加到正则表达式
答案 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'