我遇到了一个我认为有一个简单解决方案的问题。
我正在编写一个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数据的服务器没有任何控制权,因此我无法控制它发出的编码头。我希望我能以某种方式解决这个问题。
有什么想法吗?
答案 0 :(得分:2)
该文件使用Latin-1编码,而不是UTF-8,因此您必须指定编码:
jsonData = json.JSONDecoder('latin1').decode(html)
BTW:html
是JSON文档的错误名称......
答案 1 :(得分:1)
此资源编码为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)