我建立了与Google财经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试图处理字符串时出现错误,但他无法解析欧元符号:
import urllib2
import json
import time
class GoogleFinanceAPI:
def __init__(self):
self.prefix = "http://finance.google.com/finance/info?client=ig&q="
def get(self,symbol,exchange):
url = self.prefix+"%s:%s"%(exchange,symbol)
u = urllib2.urlopen(url)
content = u.read()
obj = json.loads(content[3:])
return obj[0]
if __name__ == "__main__":
c = GoogleFinanceAPI()
while 1:
quote = c.get("MSFT","NASDAQ")
print quote
time.sleep(30)
Google财经为我提供了包含欧元符号的SAP Stock的输出:
// [ { "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" } ]
我试图使用这个函数,而不是开启者(内容[3:])部分,但有了这个我得到了同样的错误,而不是utf-8我得到了一个ascii错误。
json.loads(unicode(opener.open(...), "ISO-8859-15"))
如果有人有想法,我会非常高兴。
答案 0 :(得分:3)
您正在获取的文档似乎使用Windows代码页1252进行编码,其中欧元符号字符编码为\x80
。这是UTF-8中的无效字节和所有ISO-8859变体中的非打印控制字符。尝试:
obj = json.loads(content[3:], 'cp1252')
答案 1 :(得分:2)
出于某种原因,Google财经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嗅探。设置UA标头以获得所需的编码:
>>> u= urllib2.urlopen('http://finance.google.com/finance/info?client=ig&q=SAP:FRA', headers= {'User-Agent': 'Mozilla/5.0'})
>>> u.headers['Content-Type']
'text/html; charset=UTF-8'
BAD GOOGLE