scrapy sitemap_follow的临时正则表达式

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

如果您有一个sitemap.xml,其中包含:

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

如何编写sitemap_follow以只读取sitemap-xxx站点Map而不读取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):

正则表达式应用于整个url。我看到一个解决方案而不修改Scrapy的唯一方法是有一个只用于www.example.com的Scraperabc.com并将其添加到正则表达式中,或者只是将/添加到正则表达式中

toiithl6

toiithl61#

为了简单直接地回答你的问题,我提供了这段代码。换句话说,我可以使用正则表达式^.$来匹配站点Map索引文件中的每一项。

>>> 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 = ['^.$']

但是,同一页的文档说,“默认情况下,所有的网站Map都是遵循的。”因此,这似乎是完全没有必要的。
"我想知道你想做什么"
编辑:作为对评论的回应。你可以使用所谓的“消极的lookbehindAssert”,在这种情况下是(?<!image-)。我对此的保留意见是,你需要能够在URL的开头扫描像www.example.com这样的内容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'
ulydmbyx

ulydmbyx2#

跳过url的一个方法是在类上覆盖sitemap_filter():

class MySpider(SitemapSpider):
    name = "scraperapi_sitemap"

    /* Your current code goes here ... */

    def sitemap_filter(self, entries):
        """This method can be used to filter sitemap entries by their
        attributes, for example, you can filter locs with lastmod greater
        than a given date or (see docs) or skipping by complex regex.
        """
        image_url_pattern = '.*/image-.*'
        for entry in entries:
            result = re.match(image_url_pattern, entry['loc'])
            if result:
                logging.info("Skipping "+ str(entry))
            else:
                yield entry

相关问题