2014-11-03 152 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