Python: преобразовать JSON (возвращается по URL) в список - PullRequest
8 голосов
/ 08 января 2011

Я запрашиваю условия поиска YouTube для использования с автозаполнением jquery, но мне трудно преобразовать ответ URL в правильный формат.

В моем представлении (Django / Python) я делаю:

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

(я жестко закодировал поисковый термин = 'jump' для простоты)

Если я сделаю data2.read(), я получу то, что считаю JSON (копирование-вставка URL-адреса в браузер также возвращает это.)

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

Мне нужно вернуть это в формате, который jquery autocomplete может прочитать.Я знаю, что это сработает, если я смогу получить его в список, например, mylist = ['jumpstyle', 'jump', 'jump around', ...]

, а затем преобразовать обратно в json, прежде чем вернуть его:

json.dumps(mylist)

(Это работает, еслиЯ непосредственно определяю mylist, как написано выше.)

Но я не могу получить данные, возвращаемые URL-адресом, ни в простой список (который я затем преобразовываю обратно в JSON), либо в какую-то формуJSON, который я могу вернуть напрямую для автоматического завершения.

Я пробовал, между прочим,

j2 = json.loads(data2)

и

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

Надеюсь, кто-то можетпомощь!

Ответы [ 4 ]

13 голосов
/ 08 января 2011

удалить &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)
3 голосов
/ 08 января 2011

Вы выполняете запрос JSON-P, который автоматически упаковывает JSON в функцию обратного вызова javascript, которую вы фактически указали в запросе:)

Удалите параметр JSON-P из вашего запроса, и вы получите прямой JSON непосредственно из запроса, не выполняя никаких дополнительных действий с Python вообще.

Это должен быть ваш запрос:

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

и он вернется:

["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 голосов
/ 08 января 2011

Выходные данные со страницы не являются правильными данными в формате json.Вам нужно удалить вызов функции js, оборачивая его.

сделать это:

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 теперь является массивом python.

0 голосов
/ 08 января 2011

это не json, это javascript, если вы хотите использовать его как json, вы должны удалить часть javascript:

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

, но вы можете просто изменить URL-адрес (удалите jsonp = window.ytwww.suggest.handleResponse 'part), чтобы получить чистый вывод 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']], '', '', '', '', '', {}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...