哪里的Response转换为其子类之一?

时间:2015-07-28 03:00:19

标签: scrapy

我试图编写一个下载器中间件,忽略没有预定义元素的响应。但是,我不能在中间件中使用HtmlResponse类的css方法,因为此时响应的类型只是Response。当它到达蜘蛛时,它是一个HtmlResponse,但是由于我无法对中间件状态执行某些操作,所以为时已晚。

响应的最终类型集在哪里?

1 个答案:

答案 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 类中。

要解决您的问题,请稍后在管道上订购中间件(使用较低的订单号)或自行转换响应(但我不会这样做)。