是否可以在中间件中修改scrapy Response对象?

时间:2017-10-24 21:38:58

标签: python python-3.x scrapy

我从几个欧盟网站上搜集了一些数据,发现有时我对response.xpath()的调用会破坏文字。例如,我发现像"& amp;" &#164这样的html实体和其他类似的实体被翻译成了像\x92\xc3等破碎的字节。 我找到了一些有效的解决方案 - 在调用xpath方法之前转义html实体(使用lxml lib)。看起来像这样:

body_str = str(response.body, response._body_declared_encoding())
unescaped_body = html.unescape(body_str)
response = response.replace(body=unescaped_body)

如果这样的代码在回调开始时立即调用以处理响应,它似乎对我很好。

我现在要做的是将此代码移到Spider Middleware中,对每个请求或其他蜘蛛等使用此方法。但问题是此代码不会修改内部的响应对象

def process_spider_input(self, response, spider):

似乎response = response.replace(...)创建了新的局部变量响应,这在其他地方并未使用。 我的问题是标题:我可以修改蜘蛛中间件内部的响应对象吗?

1 个答案:

答案 0 :(得分:0)

我认为最好将Downloader Middlewareprocess_response方法一起使用,并返回Response个对象。

...
def process_response(self, request, response, spider):
    ...
    body_str = str(response.body, response._body_declared_encoding())
    unescaped_body = html.unescape(body_str)
    new_response = response.replace(body=unescaped_body)
    return new_response