我从几个欧盟网站上搜集了一些数据,发现有时我对response.xpath()
的调用会破坏文字。例如,我发现像"& amp;" ¤
这样的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(...)
创建了新的局部变量响应,这在其他地方并未使用。
我的问题是标题:我可以修改蜘蛛中间件内部的响应对象吗?
答案 0 :(得分:0)
我认为最好将Downloader Middleware
与process_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