从HTTP响应解析Json字符串
我想解析来自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]"
}
}
]
}
我在这里看到的几个问题,但两人脱颖而出的大多是:
你正在使用BeautifulSoup解析页面。如果你真的只接收到你发布的类似JSON的文本,BeautifulSoup就不能解析它。即使它没有抛出错误,输出将会是某种形式的HTML,而不是JSON。
您显示的页面实际上并不是有效的JSON。根本没有引用
application
和user
的值。
我也有些困惑,为什么你使用Selenium来得到回应。除非在特定页面上执行了JavaScript(为此您确实可以使用真实的浏览器来执行它),那么您似乎正在使用推土机来尝试破解螺母。
使用标准库工具(urllib2
或urllib.request
,取决于您的Python版本)应该就足够了,也许只需设置一些明确的HTTP标头即可。就我个人而言,我会使用requests
module来完成这些任务;它甚至带有内置的JSON处理。
其实我并没有越来越简单的JSON字符串作为响应,但一个HTML字符串,因此我用BeautifulSoup来解析它,并找到存储在标签内的JSON。我没有公布所有这些细节。对不起,不清楚 – charan 2014-11-03 10:35:31
@charan:可能是因为你的提取方法不正确。这可能是你解析出的是JavaScript,而不是严格的JSON。这可能是因为你想要提取的信息更好地使用正则表达式来处理,等等。这就是为什么你需要a)清楚你真正解决了什么问题(而不仅仅是你自己试图解决的问题)和b)给我们一个可重复的样本,所以我们可以尝试和排除故障。你们两个都不给我们,所以我可以给你的只是一般的建议。 – 2014-11-03 10:39:07
使用Selenium的原因是我正在访问的URL是使用自签名证书,因此在使用urllib2库时会抛出与SSL相关的异常。感谢@Martijin我会记住你的建议。 – charan 2014-11-03 10:42:15
我没有看到你初始化jsondata。 – 2014-11-03 10:11:39
'jsondata'从哪里来? – 2014-11-03 10:12:36
请注意,您在此处发布的JSON无效; 'application'和'user'值没有引号。你可以通过使用linter来测试某些东西是否是有效的JSON。 JSONLint.com提供一个在线。 – 2014-11-03 10:14:42