Frage

Ich schreibe ein Python-Programm, das einen Suchbegriff führt die Google-Suche API und Downloads die ersten 10 Ergebnisse Google verwenden. Ich konnte dies in Python tun 2.6 wie folgt:

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
             % (query)
results = urllib.urlopen(url)
resultsjson = json.loads(results.read())
betterResults += resultsjson["responseData"]["results"]

Google-Such API gibt die Ergebnisse als json, so dass ich den obigen Code verwendet, um die Ergebnisse in eine json meiner und analysieren sie in eine Liste (betterResults) zum Download bereit.

Als ich in Python umgeschaltet 3, mein Programm begann Ausnahmen werfen. Offenbar in Python 2.6 die Aufgabe durch urlopen zurückgegeben () eine Datei-ähnliches Objekt, das in ein json geladen werden kann. In Python 3.1, kehrte das Objekt ein Httpresponse-Objekt, das eine Methode Read () enthält, wie sie durch die json Spezifikationen gefordert, ist aber ein Byte-Objekt. Ich konnte daher nicht auf die Informationen zuzugreifen, wie ich in 2.6 hatte.

Gibt es eine Möglichkeit, die json von Google zurück zugreifen? Wie kann ich die Ergebnisse in Python 3 und in der Lage zu wählen bekommen, welche Felder ich will, wie ich in der Lage war, mit der json zu tun?

Vielen Dank,   bsg

War es hilfreich?

Lösung

Das zurückgegebene Objekt durch urlopen is Datei wie, sie sind falsch gibt. Aber Sie verwenden json.loads (), die einen String erwartet. json.load () erwartet eine Datei wie Objekt.

Allerdings json.load () erwartet das Ergebnis der Lese (Methode) eine Zeichenfolge zu sein, während natürlich das liest Sie werden Bytes zu erhalten, so dass Sie es von Bytes in eine Zeichenfolge entschlüsseln müssen zuerst.

So etwas wie folgt aus:

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
             % (query)
results = urllib.urlopen(url)
encoding = input.getheader('content-type').split('=')[-1]
resultsjson = json.loads(results.read().decode(encoding))
betterResults += resultsjson["responseData"]["results"]

funktionieren könnte. (Ich habe es nicht getestet).

Andere Tipps

Sie müssen die Byte-Objekt entschlüsseln, wenn Sie es mit json.loads verwenden möchten

resultjson =  json.loads(results.read().decode())

docs auch vorschlagen kodieren Parameter auf die passieren loads Funktion:

json.loads(results.read(), encoding=<encoding-type>)

Ich denke, Lennart eine Erklärung hat, wie die Codierung-Typ zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top