2011-01-08 26 views
8

我請求與jQuery的自動完成功能使用YouTube的搜索詞,但我有一個很難轉換的URL響應轉換爲正確的格式。的Python:轉換JSON(通過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') 

(我硬編碼搜索項=爲簡單起見, '跳')

如果我做data2.read()我得到了我認爲是JSON (複製粘貼網址到瀏覽器也會返回此。)

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的自動完成功能可以讀取的格式返回此。我知道它會工作,如果我能得到它到一個列表,例如,mylist = ['jumpstyle', 'jump', 'jump around', ...]

然後將其轉換回JSON返回之前:

json.dumps(mylist) 

(這工作,如果我直接直接定義mylist爲)

但我無法從URL返回的數據傳遞給一個簡單的列表(然後我轉換回JSON)或某種形式的JSON,我可以直接返回被使用自動完成。

我試過,除其他事項外,

j2 = json.loads(data2) 

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

希望有人能幫助!

回答

13

刪除&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

它不是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']], '', '', '', '', '', {}] 
0

從頁的輸出是不正確的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是蟒蛇陣了。

3

你正在做自動包裝了JSON在JavaScript回調函數JSON-P請求時,你已經在事實上請求:)

地帶遠離你的請求和JSON-P參數指定的一個你將直接獲得直接從JSON的要求,而無需做任何額外的東西蟒在所有。

這應該是你的要求:

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

啊......我怎麼說看例如:[「jumpstyle」,「jump」,「jump around」...]我不確定如何操作這些數據:它是什麼?一個列表,一個字符串,一個json對象?我試過json.loads(returned_by_url),但得到一個錯誤。 – dkgirl 2011-01-08 14:41:41

+0

澤維爾似乎已經覆蓋:) – 2011-01-08 16:14:11