2012-06-17 16 views
6

「ソーシャルウェブの採掘」のサンプルコードに従っています。twitter trend api UnicodeDecodeError: 'utf8'コーデックは、位置1のバイト0x8bをデコードできません。予期しないコードバイト

私はので、私はWebページからenter link description here

を新しいサンプルに従ってくださいしかし、私はコードを実装するとき時々、私はエラー情報を被るだろうその昔を知っている:

[ trend.decode('utf-8') for trend in world_trends()[0]['trends'] ] 

とエラー情報

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "build/bdist.macosx-10.6-universal/egg/twitter/api.py", line 167, in __call__ 
File "build/bdist.macosx-10.6-universal/egg/twitter/api.py", line 173, in _handle_response 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.py", line 16, in decode 
return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: unexpected code byte 

いつも起こることはありませんが、プログラマーはこのような「ランダムな」ケースが好きではないと思います。

だから誰も私にこの問題を助けることができますか?問題とはどのように私はこれを解決することができますか?

大感謝〜デフォルトデコードすることにより

+0

データストリームを解凍します。 '0x8b'はgzipヘッダから来ます:' 1F 8B 08'。これはgzipで圧縮されたデータであるという事実が欠落しています。 –

+1

更新:これは[バグ2561件のリクエスト](https://github.com/kennethreitz/requests/issues/2561)によるものです。 –

答えて

1

()それがデコードする方法を知らないことをバイトに遭遇した場合、エラーがスローされます。

trend.decode('utf-8', 'replace')またはtrend.decode('utf-8', 'ignore')を使用すると、エラーをスローして無視しないでください。

Documentation on decode() here.

16

byte 0x8b in position 1通常データストリームはgzip圧縮されていることを知らせます。同様の問題については、hereおよびhereを参照してください。私はPythonの要求を使用して、ライブラリでこれを見ている

buf = StringIO.StringIO(<response object>.content) 
gzip_f = gzip.GzipFile(fileobj=buf) 
content = gzip_f.read() 
+0

ありがとうございます。 gzipされたくないファイルを誤ってgzipしたことがわかりました。 – dmh

関連する問題