UnicodeDecodeError:“utf8”编解码器无法解码Euro Symb字节

2024-05-13 23:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我建立了一个连接到谷歌金融API,它给我股票报价。在我转学欧洲的课程之前,一切都很顺利。这些包含欧元符号,我得到以下错误:

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\getQuotes.py", line 32, in <module>
    quote = c.get("SAP","FRA")
  File "C:\Users\Administrator\Desktop\getQuotes.py", line 21, in get
    obj = json.loads(content[3:])
  File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte

下面是我使用的代码。我猜json试图处理字符串时出现错误,但无法解析欧元符号:

^{pr2}$

以下是Google Finance为我提供包含欧元符号的SAP股票的输出:

// [ { "id": "8424920" ,"t" : "SAP" ,"e" : "FRA" ,"l" : "56.51" ,"l_cur" : "€56.51" ,"s": "0" ,"ltt":"8:00PM GMT+2" ,"lt" : "Aug 7, 8:00PM GMT+2" ,"c" : "-0.47" ,"cp" : "-0.82" ,"ccol" : "chr" } ]

我试图使用这个函数,而不是打开器(content[3:])部分,但是由于这个,我得到了相同的错误,而且我得到了一个ascii错误,而不是utf-8。在

json.loads(unicode(opener.open(...), "ISO-8859-15"))

如果有人有主意,我会很高兴的。在


Tags: inpyjsonobjlib错误line符号
2条回答

您要获取的文档似乎是用Windows代码页1252编码的,其中欧元符号字符编码为\x80。在UTF-8中这是一个无效的字节,在所有ISO-8859变体中是一个非打印控制字符。尝试:

obj = json.loads(content[3:], 'cp1252')

出于某种原因,googlefinance API返回代码页1252数据。通过查看Content-Type标题,您可以发现它已经做到了:

>>> u= urllib2.urlopen('http://finance.google.com/finance/info?client=ig&q=SAP:FRA')
>>> u.headers['Content-Type']
'text/html; charset=ISO-8859-1'

(在text/html世界中,ISO-8859-1实际上是指Windows代码页1252,这是因为冗长的历史原因。对于不同的地区还有一些其他的。天知道为什么Google要返回text/html而这显然不是一个HTML资源

但您并不真正想要代码页1252,即使您可以使用json.loads(..., 'windows-1252')对JSON来说这是一种奇怪的编码,谁知道在这种编码中没有的其他货币符号会发生什么。在

如果我在浏览器中查看相同的URL,就会得到正确的UTF-8结果。为什么?谷歌似乎在嗅探。设置UA头以获取所需的编码:

^{pr2}$

糟糕的谷歌

相关问题 更多 >