2011-01-08 8 views
8

Sto richiedendo i termini di ricerca di youtube per l'utilizzo con il completamento automatico di jquery, ma sto avendo difficoltà a convertire la risposta dell'URL in un formato corretto.Python: Converti JSON (restituito dall'URL) nell'elenco

Nel mio (Django/Python) Vista che faccio:

data2 = urllib2.urlopen('http://suggestqueries.google.com/complete/search?hl=en&ds=yt&client=youtube&hjson=t&jsonp=window.yt.www.suggest.handleResponse&q=jum&cp=3') 

(ho hardcoded il termine di ricerca = 'salto' per semplicità)

Se faccio data2.read() ottengo quello che credo sia JSON (copia-incollare l'URL in un browser restituisce anche questo.)

window.yt.www.suggest.handleResponse(["jum",[["jumpstyle","","0"],["jump","","1"],["jump around","","2"],["jump on it","","3"],["jumper","","4"],["jump around house of pain","","5"],["jumper third eye blind","","6"],["jumbafund","","7"],["jump then fall taylor swift","","8"],["jumpstyle music","","9"]],"","","","","",{}]) 

ho bisogno di tornare questo in un formato che jQuery completamento automatico in grado di leggere. So che funzionerà se posso farlo in un elenco, ad esempio, mylist = ['jumpstyle', 'jump', 'jump around', ...]

e poi riconvertirlo in JSON prima di tornare:

json.dumps(mylist) 

(questo funziona se io direttamente definisco mylist direttamente come scritto sopra.)

Ma non riesco a ottenere dai dati che vengono restituiti dall'URL a una semplice lista (che poi riconvertirò in JSON) oa qualche forma di JSON che posso tornare direttamente per essere usata da auto completo.

Ho provato, tra le altre cose,

j2 = json.loads(data2) 

e

j2 = json.loads(data2.read()) 

La speranza qualcuno può aiutare!

risposta

13

rimuovere la parte &jsonp=window.yt.www.suggest.handleResponse

import json 
import urllib2 

data = urllib2.urlopen('http://suggestqueries.google.com/complete/search?hl=en&ds=yt&client=youtube&hjson=t&q=jum&cp=3') 

j = json.load(data) 
k = [i for i, j, k in j[1]] 
l = json.dumps(k) 
+0

Questo funziona benissimo. Grazie! – dkgirl

+0

+1 bella risposta completa –

0

non è JSON è javascript, se si desidera utilizzarlo come JSON è necessario togliere la parte javascript:

j2 = json.loads(data2[37:-1]) 

, ma si può solo cambiare l'url (rimuovere il 'jsonp = window.yt.www .suggest.handleResponse' parte) per avere in uscita jSON puro:

>>> data2 = urllib2.urlopen('http://suggestqueries.google.com/complete/search?hl=en&ds=yt&client=youtube&hjson=t&q=jum&cp=3') 
>>> json.loads(data2.read()) 
[u'jum', [[u'jumpstyle', '', u'0'], [u'jump', '', u'1'], [u'jump around', '', u'2'], [u'jump on it', '', u'3'], [u'jumper', '', u'4'], [u'jump around house of pain', '', u'5'], [u'jumper third eye blind', '', u'6'], [u'jumbafund', '', u'7'], [u'jump then fall taylor swift', '', u'8'], [u'jumpstyle music', '', u'9']], '', '', '', '', '', {}] 
0

l'uscita dalla pagina non è un dato corretto jSON codificati. È necessario rimuovere la chiamata alla funzione js avvolgendola.

fare questo:

import urllib2 
import re 
import json 

data2 = urllib2.urlopen('http://suggestqueries.google.com/complete/search?' +  
    'hl=en&ds=yt&client=youtube&hjson=t&jsonp=window.yt.' + 
    'www.suggest.handleResponse&q=jum&cp=3') 

data = re.compile('^[^\(]+\(|\)$').sub('', data2.read()) 
parsedData = json.loads(data) 

parsedData è array pitone ora.

3

si sta facendo una richiesta JSON-P che avvolge automaticamente il JSON in una funzione di callback javascript, quello che hai specificato nella richiesta di fatto :)

spogliare il parametro JSON-P dalla vostra richiesta e otterrete direttamente il JSON direttamente dalla richiesta, senza dover fare altro.

Questa dovrebbe essere la vostra richiesta:

http://suggestqueries.google.com/complete/search?hl=en&ds=yt&client=youtube&hjson=t&q=jum&cp=3 

e restituirà:

["jum",[["jumpstyle","","0"],["jump","","1"],["jump around","","2"],["jump on it","","3"],["jumper","","4"],["jump around house of pain","","5"],["jumper third eye blind","","6"],["jumbafund","","7"],["jump then fall taylor swift","","8"],["jumpstyle music","","9"]],"","","","","",{}] 
+0

Ah ... Come faccio a ottenere che a guardare come: ["jumpstyle", "jump", "jump around" ...] Non sono sicuro di come manipolare questi tipi di dati: che cos'è? Una lista, una stringa, un oggetto json? Ho provato json.loads (return_by_url) ma ho ricevuto un errore. – dkgirl

+0

Xavier sembra aver capito che :) –