我试图编写一个下载器中间件,忽略没有预定义元素的响应。但是,我不能在中间件中使用HtmlResponse类的css
方法,因为此时响应的类型只是Response
。当它到达蜘蛛时,它是一个HtmlResponse,但是由于我无法对中间件状态执行某些操作,所以为时已晚。
响应的最终类型集在哪里?
答案 0 :(得分:1)
如果没有看到中间件的代码,很难说出问题是什么。
但是我的中间件下面会得到一个HtmlResponse
对象:
class FilterMiddleware(object):
def process_response(self, request, response, spider):
print response.__class__
print type(response)
return response**strong text**
两个印刷语句都验证了这一点:
<class 'scrapy.http.response.html.HtmlResponse'>
<class 'scrapy.http.response.html.HtmlResponse'>
我可以在响应中使用css
方法,没有任何异常。 settings.py
中的中间件顺序无关紧要:使用10,100或500我得到的结果与上面相同。
然而如果我将中间件配置为 590 或更高版本,我会得到普通的旧Response
对象。这是因为转换发生在the current version中 35 行的 HttpCompressionMiddleware
类中。
要解决您的问题,请稍后在管道上订购中间件(使用较低的订单号)或自行转换响应(但我不会这样做)。