2011-01-08 28 views
8

Estoy solicitando los términos de búsqueda de YouTube para usar con la función autocompletar de jquery, pero estoy teniendo dificultades para convertir la respuesta de la URL en un formato adecuado.Python: Convierta JSON (devuelto por una URL) en la Lista

En mi opinión (Django/Python) que hago:

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') 

(I hardcoded el término de búsqueda = 'saltan' para simplificar)

Si hago data2.read() consigo lo que yo creo es JSON (copiar y pegar la URL en un navegador, también regresa este.)

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"]],"","","","","",{}]) 

necesito devolver esto en un formato que puede leer jQuery autocompletado. Sé que va a funcionar si lo puedo conseguir en una lista, por ejemplo, mylist = ['jumpstyle', 'jump', 'jump around', ...]

y después convertirlo de nuevo en JSON antes de devolverlo:

json.dumps(mylist) 

(esto funciona si defino directamente mylist directamente como escrito arriba.)

Pero no puedo obtener de los datos devueltos por la URL una lista simple (que luego convierto de nuevo a JSON) o alguna forma de JSON que puedo devolver directamente para ser utilizada por auto completo

lo he intentado, entre otras cosas,

j2 = json.loads(data2) 

y

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

espero que alguien pueda ayudar!

Respuesta

13

quitar 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

Esto funciona genial. ¡Gracias! – dkgirl

+0

+1 bonita respuesta completa –

0

no es JSON es javascript, si desea utilizarlo como JSON debe pelar la parte javascript:

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

pero se puede simplemente cambiar la url (quitar el 'jsonp = window.yt.www .suggest.handleResponse' parte) para tener pura de salida JSON:

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

la salida de la página no es un conjunto de datos JSON codificados adecuada. Debe eliminar la llamada a la función js envolviéndolo.

hacer esto:

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 es gama pitón ahora.

3

que está haciendo una solicitud JSON-P, que ajusta automáticamente el JSON en una función de devolución de llamada javascript, el que ha especificado en la solicitud de hecho :)

Pele el parámetro JSON-P de su solicitud y obtendrá directamente JSON directamente de la solicitud sin tener que hacer ninguna operación adicional de Python.

Ésta debe ser su solicitud:

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

y volverá:

["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 ... ¿Cómo consigo que mirar como: ["jumpstyle", "jump", "jump around" ...] No estoy seguro de cómo manipular este tipo de datos: ¿qué es? Una lista, una cadena, un objeto json? Intenté json.loads (returned_by_url) pero obtengo un error. – dkgirl

+0

Xavier parece haber cubierto eso :) –

Cuestiones relacionadas