Python:将JSON(由URL返回)转换为列表

Python:将JSON(由URL返回)转换为列表,python,json,Python,Json,我请求youtube搜索词与jquery autocomplete一起使用,但很难将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.handleResp

我请求youtube搜索词与jquery autocomplete一起使用,但很难将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复制粘贴到浏览器中也会返回这个。)

我需要以jQueryAutoComplete可以读取的格式返回这个。我知道如果我能把它放到一个列表中,它就会起作用,例如,
mylist=['jumpstyle','jump','jumparound',…]

然后在返回之前将其转换回json:

json.dumps(mylist)
(如果我像上面所写的那样直接定义
mylist
,这就行了。)

但我无法从URL返回的数据中获取简单列表(然后将其转换回JSON)或某种形式的JSON,我可以直接返回以供auto complete使用

我试过,除其他外

j2 = json.loads(data2)


希望有人能帮忙

它不是json,而是javascript,如果您想将其用作json,必须去掉javascript部分:

j2 = json.loads(data2[37:-1])
但您只需更改url(删除'jsonp=window.yt.www.suggest.handleResponse'部分)即可获得纯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']], '', '', '', '', '', {}]

页面的输出不是正确的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数组

您正在执行一个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"]],"","","","","",{}]

删除
&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)

啊。。。我如何让它看起来像:[“jumpstyle”、“jump”、“jump”…]我不知道如何处理这些类型的数据:它是什么?一个列表,一个字符串,一个json对象?我尝试了json.loads(通过url返回),但出现了一个错误。Xavier似乎已经涵盖了这一点:)
["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"]],"","","","","",{}]
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)