3

私は簡単な解決策があると信じている問題を抱えています。

URL から JSON 文字列を読み取って解析する Python スクリプトを作成しています。これを行うために、urllib2 と simplejson を使用しています。

私が抱えている問題は、エンコーディングに関係しています。私が読んでいる URL は、それがどのエンコーディングであるかを明示的に述べておらず (私が知る限り)、いくつかのアイスランド文字を返します。ここから読み取っている 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' codec can't decode byte 0xe1 in position 35: invalid continuation byte

JSON データを保持するサーバーを制御できないため、サーバーが送信するエンコード ヘッダーを制御できません。どうにかして、これを自分の側で解決できることを願っています。

何か案は?

4

3 に答える 3

2

ファイルは UTF-8 ではなく、Latin-1 を使用してエンコードされているため、エンコードを指定する必要があります。

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

ところで:htmlJSONドキュメントの悪い名前です...

于 2012-02-26T00:04:48.727 に答える
1

http://haukurhaf.net/json.txt

このリソースは、ISO-8859-1、またはおそらく Windows バリアント コード ページ 1252 としてエンコードされています。これはUTF-8ではありません。

で読み取って、解析できるはずresponse.read().decode('cp1252')の Unicode 文字列を取得できます。[simple]json

ただし、バイト形式では、JSON は UTF でエンコードする必要があります。したがって、これは有効な JSON ではなく、ブラウザから読み込もうとすると失敗します。

于 2012-02-26T00:04:07.133 に答える
-1

最初に文字列を unicode にする必要があります (現在は latin-1 です):

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

または、simplejson持っていない場合loads:

json.JSONDecoder().decode(uhtml)
于 2012-02-25T23:57:28.090 に答える