0

我正在使用/学习scrapy,python 框架来抓取一些我感兴趣的网页。在那之后,我提取了页面中的链接。但在大多数情况下,这些链接是相对的。我使用urljoin_rfcwhich is present inscrapy.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。如果我做得非常糟糕,请引起我的注意。

4

1 回答 1

3

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

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

所以你可以有包装函数调用你的_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)
    ...
于 2013-11-14T10:03:16.607 回答