2012-06-17 11 views
6

Sto cercando di seguire il codice di esempio del libro "Mining the social web", 1-3.trend di twitter api UnicodeDecodeError: il codec 'utf8' non può decodificare il byte 0x8b in posizione 1: byte di codice inaspettato

So che la sua vecchia, quindi seguo il nuovo campione dalla pagina web enter link description here

Ma, a volte, io soffrirò Info errore quando a implementare il codice:

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

e le informazioni di errore è come questo:

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 

Esso non sempre succedere, ma credo che nessun programmatore piace un caso come "random".

Quindi qualcuno mi può aiutare su questo problema? Qual è il problema e come posso risolvere questo?

Great thanks ~

+0

sto vedendo questo in una biblioteca utilizzando le richieste di pitone. '0x8b' proviene dall'intestazione gzip:' 1F 8B 08'. Manca qualcosa il fatto che si tratti di dati compressi con gzip. Aggiornamento –

+1

: Ciò era dovuto a [bug 2561 delle richieste] (https://github.com/kennethreitz/requests/issues/2561). –

risposta

1

Per decodificare default() genera un errore se incontra un byte che non sa come decodificare.

È possibile utilizzare trend.decode('utf-8', 'replace') o trend.decode('utf-8', 'ignore') per non generare un errore e ignorarlo silenziosamente.

Documentation on decode() here.

16

byte 0x8b in position 1 solito segnala che il flusso di dati viene compresso con gzip. Per problemi simili, vedere here e here.

per decomprimere il flusso di dati:

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

Grazie per aver segnalato questo. Mi ha aiutato a scoprire che inavvertitamente avevo gzipato alcuni file che non dovevano essere compressi con gzip. – dmh

Problemi correlati