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

Python scrapy item loader从提取的url获取绝对url,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我正在使用/learningscrapy,python框架来刮取我感兴趣的几个网页。在这一步中,我提取了页面中的链接。但在大多数情况下,这些联系是相对的。我使用urljoin\u rfc获取绝对路径,该路径出现在scrapy.utils.url中。它工作得很好 在学习的过程中,我遇到了一个名为项目加载器的功能。现在我想使用itemloader做同样的事情。我的urljoin\u rfc()位于用户定义的函数中。我希望我的加载程序现在引用函数\u urljoin。因此,在我的loader类中,我执

我正在使用/learning
scrapy
,python框架来刮取我感兴趣的几个网页。在这一步中,我提取了页面中的链接。但在大多数情况下,这些联系是相对的。我使用
urljoin\u rfc
获取绝对路径,该路径出现在
scrapy.utils.url
中。它工作得很好

在学习的过程中,我遇到了一个名为
项目加载器
的功能。现在我想使用itemloader做同样的事情。我的
urljoin\u rfc()
位于用户定义的函数中。我希望我的加载程序现在引用函数
\u urljoin
。因此,在我的loader类中,我执行
link\u in=\u urljoin()
。因此,我将我的_urljoin声明保存到
_urljoin(url,response=loader\u context.response)
。 但是我得到一个错误,说
namererror:name'loader\u context'没有定义


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

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

现在,
项目加载器的处理器可以接受上下文,但上下文是所有输入和输出处理器之间共享的任意键/值的dict()

因此,您可以使用包装函数调用您的
\u urljoin(url,response)

在您的
ItemLoader
定义中:

    ...
    link_in = MapCompose(urljoin_w_context)
    ...
最后,在回调代码中,当实例化
ItemLoader
时,传递响应引用:

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

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

现在,
项目加载器的处理器可以接受上下文,但上下文是所有输入和输出处理器之间共享的任意键/值的dict()

因此,您可以使用包装函数调用您的
\u urljoin(url,response)

在您的
ItemLoader
定义中:

    ...
    link_in = MapCompose(urljoin_w_context)
    ...
最后,在回调代码中,当实例化
ItemLoader
时,传递响应引用:

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

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

现在,
项目加载器的处理器可以接受上下文,但上下文是所有输入和输出处理器之间共享的任意键/值的dict()

因此,您可以使用包装函数调用您的
\u urljoin(url,response)

在您的
ItemLoader
定义中:

    ...
    link_in = MapCompose(urljoin_w_context)
    ...
最后,在回调代码中,当实例化
ItemLoader
时,传递响应引用:

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

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

现在,
项目加载器的处理器可以接受上下文,但上下文是所有输入和输出处理器之间共享的任意键/值的dict()

因此,您可以使用包装函数调用您的
\u urljoin(url,response)

在您的
ItemLoader
定义中:

    ...
    link_in = MapCompose(urljoin_w_context)
    ...
最后,在回调代码中,当实例化
ItemLoader
时,传递响应引用:

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


这意味着我不能有一个加载函数和一个通用函数的共同点。我也不怎么想加入。因此,我将在两个不同的功能(装载机功能和通用功能)中完成我的工作,这将节省我的切换时间。谢谢您,此代码
link\u in=urljoin\u w\u context
应该在哪里?我在一个类abcLoader(ItemLoader)中的spider中编写了这段代码,如果您能告诉我应该在哪里以及如何调用Loader function@paul t,我会很高兴。我编辑了我的答案,以便在ItemLoader中使用处理器。其他使用输入/输出处理器的方法在本文中有详细介绍,我发现这里有点混乱。没有获得添加加载程序的写入方式。您能告诉我应该在哪里以及如何声明和定义ItemLoader吗。根据我在哪个文件中的位置。它是在蜘蛛还是在项目。我应该使用Mapcompose()吗。我不能直接调用一个函数名,这意味着我不能有一个加载器函数和一个通用函数。我也不怎么想加入。因此,我将在两个不同的功能(装载机功能和通用功能)中完成我的工作,这将节省我的切换时间。谢谢您,此代码
link\u in=urljoin\u w\u context
应该在哪里?我在一个类abcLoader(ItemLoader)中的spider中编写了这段代码,如果您能告诉我应该在哪里以及如何调用Loader function@paul t,我会很高兴。我编辑了我的答案,以便在ItemLoader中使用处理器。其他使用输入/输出处理器的方法在本文中有详细介绍,我发现这里有点混乱。没有获得添加加载程序的写入方式。您能告诉我应该在哪里以及如何声明和定义ItemLoader吗。根据我在哪个文件中的位置。它是在蜘蛛还是在项目。我应该使用Mapcompose()吗。我不能直接调用一个函数名,这意味着我不能有一个加载器函数和一个通用函数。我也不怎么想加入。因此,我将在两个不同的功能(装载机功能和通用功能)中完成我的工作,这将节省我的切换时间。谢谢您,此代码
link\u in=urljoin\u w\u context
应该在哪里?我在一个类abcLoader(ItemLoader)中的spider中编写了这段代码,如果您能告诉我应该在哪里以及如何调用Loader function@paul t,我会很高兴。我编辑了我的答案,以便在ItemLoader中使用处理器。其他使用输入/输出处理器的方法在本文中有详细介绍,我发现这里有点混乱。没有获得添加加载程序的写入方式。您能告诉我应该在哪里以及如何声明和定义ItemLoader吗。根据我在哪个文件中的位置。它是在蜘蛛还是在项目。我应该使用Mapco吗