2

株価情報を提供する Google Finance 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 Finance がユーロ記号を含む 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" } ]

この関数を使用しようとしましたが、オープナーの代わりに (content[3:]) 部分を使用しようとしましたが、これで同じエラーが発生し、utf-8 の代わりに ascii エラーが発生しました。

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

誰かがアイデアを持っていれば、私はとても幸せです.

4

2 に答える 2

3

取得しているドキュメントは Windows Codepage 1252 でエンコードされているようです。ユーロ記号は としてエンコードされてい\x80ます。これは、UTF-8 では無効なバイトであり、すべての ISO-8859 バリアントでは非印刷制御文字です。試す:

obj = json.loads(content[3:], 'cp1252')
于 2013-08-08T01:45:42.813 に答える
2

何らかの理由で、Google Finance 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 の結果が得られます。なんで?Google は 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'

悪いグーグル

于 2013-08-08T16:28:56.027 に答える