Python Scrapy使用输入处理器获取绝对url
我正在尝试创建一个输入处理器,以基于Stackoverflow post将刮取的相对URL转换为绝对URL。我正在与loader_上下文概念作斗争,我可能在这里混淆了一些东西。谁能给我指一下正确的方向吗 我在items.py中有以下内容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
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)