解析从URL读取的JSON时出现问题

时间:2012-02-25 23:42:34

标签: python unicode encoding urllib2 simplejson

我遇到了一个我认为有一个简单解决方案的问题。

我正在编写一个Python脚本,该脚本从URL读取JSON字符串并对其进行解析。要做到这一点,我使用urllib2和simplejson。

我遇到的问题与编码有关。我读取的URL没有明确说明它在哪种编码中(据我所知)并返回一些冰岛字符。我无法透露我在这里阅读的网址,但我已经在自己的服务器上设置了一个示例JSON数据文件,而且我也在阅读时遇到了问题。 这是文件:http://haukurhaf.net/json.txt

这是我的代码:

# coding: utf-8
#!/usr/bin/env python
import urllib2, re, os
from BeautifulSoup import BeautifulSoup
import simplejson as json

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'

def fetchPage(url):
    req = urllib2.Request(url)
    req.add_header('User-Agent', user_agent)
    response = urllib2.urlopen(req)
    html = response.read()
    response.close()
    return html

html = fetchPage("http://haukurhaf.net/json.txt")
jsonData = json.JSONDecoder().decode(html)

JSON解析器因此错误消息崩溃:UnicodeDecodeError:' utf8'编解码器不能解码位置35中的字节0xe1:无效的连续字节

由于我对拥有JSON数据的服务器没有任何控制权,因此我无法控制它发出的编码头。我希望我能以某种方式解决这个问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

该文件使用Latin-1编码,而不是UTF-8,因此您必须指定编码:

jsonData = json.JSONDecoder('latin1').decode(html)

BTW:html是JSON文档的错误名称......

答案 1 :(得分:1)

  

http://haukurhaf.net/json.txt

此资源编码为ISO-8859-1,或者更可能是Windows变体代码页1252.它不是 UTF-8。

您可以使用response.read().decode('cp1252')阅读它以获取[simple]json也应该能够解析的Unicode字符串。

但是,在字节形式中,JSON必须以UTF编码。因此,这不是有效的JSON,如果您尝试从浏览器加载它也会失败。

答案 2 :(得分:-1)

你需要先创建字符串unicode(现在是latin-1):

uhtml = html.decode("latin-1")
jdata = json.loads(uhtml)

或者,如果simplejson没有loads

json.JSONDecoder().decode(uhtml)