scrapy item loader从提取的url中获取绝对url

时间:2013-11-14 05:09:14

标签: python web-scraping scrapy

我正在使用/学习scrapy,python框架来抓取我感兴趣的网页。在那里,我提取页面中的链接。但在大多数情况下,这些链接是相对的。我使用urljoin_rfc中的scrapy.utils.url来获取绝对路径。它运作良好。

在学习过程中,我遇到了一个名为Item Loader的功能。现在我想使用Item loader来做同样的事情。我的urljoin_rfc()位于用户定义的函数函数_urljoin(url,response)中。我希望我的加载器现在引用函数_urljoin。所以在我的加载器类中,我做link_in = _urljoin()。所以我把我的_urljoin声明给了_urljoin(url, response = loader_context.response)。 但我收到错误NameError: name 'loader_context' is not defined

我需要帮助。我这样做是因为,不仅在加载时我调用_urljoin(),我的代码的其他部分也调用函数_urljoin。如果我非常糟糕,请提请我注意。

1 个答案:

答案 0 :(得分:3)

如果您在其他地方使用_urljoin(url, response),您可以保持原样,接受作为第二个参数的回复。

现在,Item Loaders的处理器可以接受上下文,但上下文是所有输入和输出处理器之间共享的任意键/值的字典from the docs )。

所以你可以调用你的_urljoin(url, response)包裹函数:

def urljoin_w_context(url, loader_context):
    response = loader_context.get('response')
    return _urljoin(url, response)

并在ItemLoader定义中:

    ...
    link_in = MapCompose(urljoin_w_context)
    ...

最后在您的回调代码中,当您实例化ItemLoader时,传递响应引用:

def parse_something(self, response):
    ...
    loader = ItemLoader(item, response=response)
    ...