Python Scrapy使用输入处理器获取绝对url

Python Scrapy使用输入处理器获取绝对url,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我正在尝试创建一个输入处理器,以基于Stackoverflow post将刮取的相对URL转换为绝对URL。我正在与loader_上下文概念作斗争,我可能在这里混淆了一些东西。谁能给我指一下正确的方向吗 我在items.py中有以下内容 import scrapy from scrapy.loader import ItemLoader from scrapy.loader.processors import MapCompose from urlparse import urljoin de

我正在尝试创建一个输入处理器,以基于Stackoverflow post将刮取的相对URL转换为绝对URL。我正在与loader_上下文概念作斗争,我可能在这里混淆了一些东西。谁能给我指一下正确的方向吗

我在items.py中有以下内容

import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose
from urlparse import urljoin

def convert_to_baseurl(url, loader_context):
    response = loader_context.get('response')
    return urljoin(url, response)


class Item(scrapy.Item):
    url = scrapy.Field(
        input_processor=MapCompose(convert_to_baseurl)
    )
下面是我的蜘蛛

class webscraper(scrapy.Spider):
    name = "spider"

    def start_requests(self):
        yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        for entry in response.css('li.aanbodEntry'):
            loader = ItemLoader(item=Huis(), selector=entry)
            loader.add_css('url', 'a')

            yield loader.load_item()
您引用的答案中的
\u urljoin()
是OP编写的函数,其签名与stdlib中的签名不同。
使用stdlib的正确方法是:

return urljoin(response.url, url)
但是,无需使用,因为您可以使用:

要通过
上下文
属性访问响应,您需要在创建项目加载器时将其作为参数传递,或者使用以下内容中提到的其他方法:

您引用的答案中的
\u urljoin()
是OP编写的函数,其签名与stdlib中的签名不同。
使用stdlib的正确方法是:

return urljoin(response.url, url)
但是,无需使用,因为您可以使用:

要通过
上下文
属性访问响应,您需要在创建项目加载器时将其作为参数传递,或者使用以下内容中提到的其他方法:


谢谢你的回答。很高兴发现Scrapy内置了这个。但是,我尝试按照您的建议使用response.urljoin(),但得到了一个AttributeError:'NoneType'对象没有属性'urljoin'。啊,很抱歉,您需要将响应作为参数传递给项目加载器,以便通过
上下文访问它。我会更新我的答案来提及这一点。效果很好。非常感谢你!谢谢你的回答。很高兴发现Scrapy内置了这个。但是,我尝试按照您的建议使用response.urljoin(),但是我得到了一个“AttributeError:'NoneType”对象没有属性“urljoin”。啊,对不起,您需要将响应作为参数传递给项目加载器,以便通过
上下文访问它。将更新我的答案以提及这一点。效果非常好。非常感谢!
loader = ItemLoader(item=Huis(), selector=entry, response=response)