2015-07-29 8 views
9

Im Wesentlichen habe ich eine Anfrage an eine Website und bekam eine Byte-Antwort zurück: b'[{"geonameId:"703448"}..........'. Ich bin verwirrt, denn obwohl es vom Typ Byte ist, ist es sehr menschlich lesbar und erscheint wie eine Liste von Json. Ich weiß, dass die Antwort in latin1 von laufendem kodiert wird, das ISO-859-1 zurückgab, und ich habe versucht, es zu entschlüsseln, aber es gibt nur eine leere Zeichenkette zurück. Hier ist, was ich bisher habe:Anfrage liefert Bytes und ich bin nicht in der Lage, sie zu decodieren

r = response.content 
string = r.decode("ISO-8859-1") 
print (string) 

und das ist, wo es eine leere Zeile druckt. Allerdings, wenn ich

len(string) 

laufen erhalte ich: zurück 31023 Wie kann ich dieses Bytes ohne immer wieder eine leere Zeichenfolge entschlüsseln?

+0

in Python 2.x gibt str' können Sie habe einige codierte Zeichen, die sich irgendwo irgendwo versteckt haben. Auf Python 3.x erhalten Sie ein 'Bytes' Literal. Warum glauben Sie, dass Sie eine Codierung/Decodierung durchführen müssen? –

+0

Weil ich den JSON parsen muss, und ich gerade versucht habe, es zu überspielen: mit 'für i in Reichweite (len (Inhalt)): Inhalt [i] drucken 'und es wird nur viele Zahlen ausgedruckt. –

Antwort

7

Haben Sie versucht, es mit dem json Modul zu analysieren?

import json 
parsed = json.loads(response.content) 
+1

Ja und ich habe: 'JSON Objekt muss str sein, nicht 'Bytes'' –

+0

Und wenn Sie' json.loads (response.content.decode (' latin1 ')) '? – mzc

+0

Das hat den Trick gemacht. Vielen Dank! –

8

Eine andere Lösung ist response.text zu verwenden, die den Inhalt in Unicode die b-Präfix eine Art `die eingeschlossenen Zeichenfolge werden verursacht

Type:  property 
String form: <property object at 0x7f76f8c79db8> 
Docstring: 
Content of the response, in unicode. 

If Response.encoding is None, encoding will be guessed using 
``chardet``. 

The encoding of the response content is determined based solely on HTTP 
headers, following RFC 2616 to the letter. If you can take advantage of 
non-HTTP knowledge to make a better guess at the encoding, you should 
set ``r.encoding`` appropriately before accessing this property. 
+2

Dies ist eine viel bessere Idee als die akzeptierte Antwort, da es die entsprechende Codierung verwenden wird. – drevicko

+1

Ja, das wird in der Dokumentation vorgeschlagen: http://docs.python-requests.org/en/master/user/quickstart/#response-content –

Verwandte Themen