2011-01-08 8 views
8

Żądam terminów wyszukiwawczych youtube do użycia z autouzupełnianiem jquery, ale mam problem z przekonwertowaniem odpowiedzi URL na odpowiedni format.Python: Konwertuj JSON (zwrócony przez URL) na listę

W moim (Django/Python) Widok zrobić:

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 sztywno poszukiwaniu TERM = 'skok' dla uproszczenia)

Jeśli robię data2.read() mam w co wierzę jest JSON (copy-wklejając URL w przeglądarce zwraca również ten.)

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

muszę wrócić w tym w formacie, który można odczytać jQuery autouzupełniania. Wiem, że to będzie działać, jeśli mogę dostać go na liście, na przykład, mylist = ['jumpstyle', 'jump', 'jump around', ...]

a następnie przekształcić go z powrotem do json przed wpuszczeniem go:

json.dumps(mylist) 

(To działa, jeśli bezpośrednio określić mylist bezpośrednio jako napisane powyżej.)

Ale nie mogę uzyskać danych, które są zwracane przez adres URL do prostej listy (którą następnie zamieniam z powrotem w JSON) lub do jakiejś formy JSON, którą mogę zwrócić bezpośrednio do użycia przez autouzupełnienie.

Próbowałem, między innymi,

j2 = json.loads(data2) 

i

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

nadzieję, że ktoś może pomóc!

Odpowiedz

13

usunąć &jsonp=window.yt.www.suggest.handleResponse część

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

To działa świetnie. Dzięki! – dkgirl

+0

+1 miła kompletna odpowiedź –

0

to nie JSON jest JavaScript, jeśli chcesz używać go jako JSON trzeba rozebrać część javascript:

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

ale można po prostu zmienić adres URL (usuń „jsonp = window.yt.www część .suggest.handleResponse”), uzyskując czysty wyjście 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

wyjście ze strony nie jest odpowiedni json zakodowanych danych. Musisz usunąć funkcję js owijając ją.

to zrobić:

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 jest tablicę Pythona teraz.

3

Robicie żądanie JSON-P, które automatycznie owija JSON w javascript funkcji zwrotnej, ten, który został określony w żądaniu w rzeczywistości :)

znieść parametr JSON-P z życzenie otrzymasz prosto JSON bezpośrednio z żądania bez konieczności wykonywania jakichkolwiek dodatkowych zadań pythona.

ten powinien być Twój wniosek:

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

i powróci:

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

Ach ... Jak mogę to patrzeć jak: ["jumpstyle", "jump", "jump around" ...] Nie jestem pewien jak manipulować tymi danymi: co to jest? Lista, ciąg znaków, obiekt JSON? Próbowałem json.loads (zwrócił_by_url), ale dostałem błąd. – dkgirl

+0

Xavier wydaje się, że to pokryło :) –