2014-11-03 193 views
-1

我想解析來自Python中HTTP請求的JSON響應。但我收到以下異常:從HTTP響應解析Json字符串

ValueError: No JSON object could be decoded 

Python代碼:

profile = webdriver.FirefoxProfile() 
profile.set_preference('network.http.phishy-userpass-length', 255) 
browser = webdriver.Firefox(firefox_profile=profile) 
browser.get("https://"+username+":"+password+"@"+url) 
htmltext= str(browser.page_source) 
html=soup(htmltext) 
jsondata= str(html.find('pre')).strip('</pre>') 
data=json.loads(jsondata) 
print data['entries'] 

JSON響應:

{ 
    "count":1, 
    "entries": 
    [ 
     { 
     "id":15862, 
     "application":loginAudit, 
     "user":[email protected], 
     "time":"2014-10-30T02:08:14.103-04:00", 
     "values": 
     { 
       "\/loginAudit\/login\/no-error\/user":"[email protected]" 
     } 

     } 
    ] 
} 
+0

我沒有看到你初始化jsondata。 – 2014-11-03 10:11:39

+0

'jsondata'從哪裏來? – 2014-11-03 10:12:36

+0

請注意,您在此處發佈的JSON無效; 'application'和'user'值沒有引號。你可以通過使用linter來測試某些東西是否是有效的JSON。 JSONLint.com提供一個在線。 – 2014-11-03 10:14:42

回答

2

我在這裏看到的幾個問題,但兩人脫穎而出的大多是:

  1. 你正在使用BeautifulSoup解析頁面。如果你真的只接收到你發佈的類似JSON的文本,BeautifulSoup就不能解析它。即使它沒有拋出錯誤,輸出將會是某種形式的HTML,而不是JSON。

  2. 您顯示的頁面實際上並不是有效的JSON。根本沒有引用applicationuser的值。

我也有些困惑,爲什麼你使用Selenium來得到迴應。除非在特定頁面上執行了JavaScript(爲此您確實可以使用真實的瀏覽器來執行它),那麼您似乎正在使用推土機來嘗試破解螺母。

使用標準庫工具(urllib2urllib.request,取決於您的Python版本)應該就足夠了,也許只需設置一些明確的HTTP標頭即可。就我個人而言,我會使用requests module來完成這些任務;它甚至帶有內置的JSON處理。

+0

其實我並沒有越來越簡單的JSON字符串作爲響應,但一個HTML字符串,因此我用BeautifulSoup來解析它,並找到存儲在標籤內的JSON。我沒有公佈所有這些細節。對不起,不清楚 – charan 2014-11-03 10:35:31

+1

@charan:可能是因爲你的提取方法不正確。這可能是你解析出的是JavaScript,而不是嚴格的JSON。這可能是因爲你想要提取的信息更好地使用正則表達式來處理,等等。這就是爲什麼你需要a)清楚你真正解決了什麼問題(而不僅僅是你自己試圖解決的問題)和b)給我們一個可重複的樣本,所以我們可以嘗試和排除故障。你們兩個都不給我們,所以我可以給你的只是一般的建議。 – 2014-11-03 10:39:07

+0

使用Selenium的原因是我正在訪問的URL是使用自簽名證書,因此在使用urllib2庫時會拋出與SSL相關的異常。感謝@Martijin我會記住你的建議。 – charan 2014-11-03 10:42:15