Python Scrapy spider:处理错误定义字符编码的页面

Python Scrapy spider:处理错误定义字符编码的页面,python,unicode,scrapy,Python,Unicode,Scrapy,更新:只需从命令行运行以下命令,即可复制此错误: scrapy shell http://www.indiegogo.com/Straight-Talk-About-Your-Future 我正在用Scrapy爬网一个网站。我刮取的每一页都声称编码为UTF-8: <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> 我仍然需要清理这些页面,即使它们包含不可映射的字符。有没有办法告诉Scrapy重写

更新:只需从命令行运行以下命令,即可复制此错误:

scrapy shell http://www.indiegogo.com/Straight-Talk-About-Your-Future

我正在用Scrapy爬网一个网站。我刮取的每一页都声称编码为UTF-8:

<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
我仍然需要清理这些页面,即使它们包含不可映射的字符。有没有办法告诉Scrapy重写页面声明的编码,并改用另一种编码(比如UTF-16)

以下是捕获异常的位置:

2012-05-30 14:43:20+0200 [igg] ERROR: Spider error processing <GET http://www.site.com/page>
    Traceback (most recent call last):
      File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1178, in mainLoop
        self.runUntilCurrent()
      File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 800, in runUntilCurrent
        call.func(*call.args, **call.kw)
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 368, in callback
        self._startRunCallbacks(result)
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 464, in _startRunCallbacks
        self._runCallbacks()
    --- <exception caught here> ---
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 551, in _runCallbacks
        current.result = callback(current.result, *args, **kw)
      File "/Library/Python/2.7/site-packages/scrapy/core/spidermw.py", line 61, in process_spider_output
        result = method(response=response, result=result, spider=spider)
2012-05-3014:43:20+0200[igg]错误:蜘蛛错误处理
回溯(最近一次呼叫最后一次):
mainLoop中的文件“/Library/Python/2.7/site packages/twisted/internet/base.py”,第1178行
self.rununtlcurrent()
文件“/Library/Python/2.7/site packages/twisted/internet/base.py”,第800行,在rununtlcurrent中
call.func(*call.args,**call.kw)
文件“/Library/Python/2.7/site packages/twisted/internet/defer.py”,第368行,在回调中
自启动返回(结果)
文件“/Library/Python/2.7/site packages/twisted/internet/defer.py”,第464行,在startRunCallbacks中
self.\u runCallbacks()
---  ---
文件“/Library/Python/2.7/site packages/twisted/internet/defer.py”,第551行,在runCallbacks中
current.result=回调(current.result,*args,**kw)
文件“/Library/Python/2.7/site packages/scrapy/core/spidermw.py”,第61行,进程中输出
结果=方法(响应=响应,结果=结果,蜘蛛=蜘蛛)

我假设这是在管道中发生的,而不是在下载程序中发生的


在填充到项目中之前,清除(替换无法解码的字节)数据

由于您可能会在网页上获得各种字符编码,通常最好尽快将所有刮取的数据解码为unicode,在spider中将其作为unicode处理,然后在最后一分钟(打印或放入数据库之前)将其编码为您所需的任何编码。我实际上为此写了一篇文章(根据我自己使用scrapy的经验)两天前,这可能会有所帮助

在最新的开发人员scrapy(0.15)中进行了一些编码工作。可能值得尝试最新版本

Scrapy允许您通过访问unicode。这以与浏览器类似的方式处理编码检测,您几乎应该始终使用它,而不是原始正文。从Scrapy 0.15开始,它依赖于,并进行了一些自定义

当有人请求unicode时,解码会延迟进行。您可以创建一个新的响应,根据您在spider中收到的响应指定自己的编码,但是,这应该不是必需的

从回溯中还不清楚到底是哪一段代码导致了错误的发生。是否有更多的细节?另一种可能是主体不知何故被截断了


如果这些页面是由浏览器而不是scrapy正确处理的,那么如果您能够制作一个简单的测试用例并报告一个bug,我们将不胜感激。

我认为在使用
HtmlXpathSelector(response)
时会发生这种情况,您可以添加我的字符串.encode('utf8')为了避免这个错误。谢谢Shane。这个错误可以很容易地从Scrapy shell复制:
Scrapy shellhttp://www.indiegogo.com/Straight-Talk-About-Your-Future
适用于我最新的scrapy,来自scrapy shell。检测到编码为utf8,正文为unicode。确实如此!刚刚升级到0.15.1,它在很好,谢谢!
2012-05-30 14:43:20+0200 [igg] ERROR: Spider error processing <GET http://www.site.com/page>
    Traceback (most recent call last):
      File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1178, in mainLoop
        self.runUntilCurrent()
      File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 800, in runUntilCurrent
        call.func(*call.args, **call.kw)
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 368, in callback
        self._startRunCallbacks(result)
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 464, in _startRunCallbacks
        self._runCallbacks()
    --- <exception caught here> ---
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 551, in _runCallbacks
        current.result = callback(current.result, *args, **kw)
      File "/Library/Python/2.7/site-packages/scrapy/core/spidermw.py", line 61, in process_spider_output
        result = method(response=response, result=result, spider=spider)