Domanda

Sto scrivendo un programma Python che alimenta un termine di ricerca a Google utilizzando l'API di ricerca di Google e scarica i primi 10 risultati. Sono stato in grado di fare questo in Python 2.6 come segue:

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"]

di ricerca di Google API restituisce i risultati come JSON, quindi ho usato il codice qui sopra per scaricare i risultati in un JSON della mia e analizzare in una lista (betterResults).

Quando sono passato a Python 3, il mio programma iniziato a lanciare eccezioni. A quanto pare, in Python 2.6 l'oggetto restituito da urlopen () è un oggetto simile a file che può essere caricato in un JSON. In Python 3.1, l'oggetto restituito è un oggetto HTTPResponse, che contiene un metodo di lettura (), come richiesto dalle specifiche json, ma è un oggetto byte. Sono stato quindi in grado di accedere alle informazioni, come ho avuto in 2.6.

C'è un modo per accedere al JSON restituito da Google? Come posso ottenere i risultati in Python 3, ed è in grado di selezionare i campi che voglio, come mi è stato in grado di fare con il JSON?

La ringrazio molto,   BSG

È stato utile?

Soluzione

L'oggetto restituito dal urlopen è file come, vi sbagliate lì. Ma si utilizza json.loads (), che si aspetta una stringa. json.load () si aspetta un file come oggetto.

Tuttavia, json.load () si aspetta che il risultato del metodo read () per essere una stringa, mentre, naturalmente, la lettura che si ottiene sarà byte, quindi è necessario decodificare da byte in una stringa prima.

Quindi, qualcosa di simile a questo:

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"]

potrebbe funzionare. (Non ho la prova di esso).

Altri suggerimenti

È necessario decodificare l'oggetto di byte, se si desidera utilizzarlo con json.loads

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

documenti suggeriscono anche di passare codifica parametro al funzione loads:

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

Credo Lennart ha una spiegazione su come ottenere la codifica-tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top