2014-10-04 41 views
4

在Python中使用HTTP請求我能夠得到響應,但無論是json還是simplejson模塊都無法解壓縮它。兩者都聲稱輸入不是很好的json。谷歌趨勢API讀取到python時不好json

import requests 
import json 

html_base = u"http://www.google.com/trends/fetchComponent?q=" 
q = u"asdf,qwerty" 
query_type = u"&cid=TIMESERIES_GRAPH_0&export=3" 
full_query = html_base + q + query_type 

response = requests.get(full_query) 
data = json.loads(response.text) 

錯誤:

C:\Anaconda\lib\json\decoder.pyc in raw_decode(self, s, idx) 
    382    obj, end = self.scan_once(s, idx) 
    383   except StopIteration: 
--> 384    raise ValueError("No JSON object could be decoded") 
    385   return obj, end 

ValueError: No JSON object could be decoded 
+0

那麼,'response.text'裏有什麼?你想要解析什麼? – 2014-10-04 21:47:41

回答

2

請原諒我的壞習慣,但是,對於任何在未來會發生這種情況的人來說,這是一個乾淨的工作。

import ast 

nice_dict = ast.literal_eval(response.text.split('setResponse(')[1].rstrip()[:-2].replace('new Date', '')) 

ast.literal_eval()採用字符串並返回一個字典。內部的所有東西都會清理JSON使其可以返回。請注意,你的日期現在是元組。

2

這是因爲它只是不JSON。如果您將URL放入瀏覽器並查看輸出結果,您會發現它實際上是JavaScript。它從一個註釋開始,然後是一個函數調用 - 而JSON本身就在函數調用中。

+0

這就是我的想法。有沒有簡單的方法來解析JS成良好的JSON沒有子字符串操作? – billmanH 2014-10-06 02:25:45

+0

不幸的是,並不容易,特別是因爲在JSON內部還有其他JavaScript函數的調用,比如'newDate'。 – Ben 2014-10-06 07:27:40

+0

無賴。感謝你的回答。我會找到另一種解決方法。 – billmanH 2014-10-06 19:06:55