我正在使用/学习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。如果我非常糟糕,请提请我注意。
答案 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)
...