2

このドキュメントを Python と BeautifulSoup で解析しようとしています:

http://en.wikipedia.org/w/api.php?format=xml&action=opensearch&search=rage_against_the_machine

この Text タグとして下にある 7 番目のアイテム:

レイジ・アゲインスト・ザ・マシーンの1994年から1995年のツアー

"Rage Against the Machine's 1994–1995 Tour" というテキストを印刷しようとすると、python から次のように表示されます。

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 31: ordinal not in range(128)

次のように u'\u2013' を '-' に置き換えるだけで解決できます。

itemText = itemText.replace(u'\u2013', '-')

しかし、私がコーディングしていないすべての文字はどうですか? 私はそれらを無視したくありませんし、可能性のあるすべての検索と置換をリストしたくもありません。

確かに、一般的な既知のエンコーディングのリストからエンコーディングを検出するのが最善です (ただし、間違っている可能性があります)。

someText = getTextWithUnknownEncoding(someLocation);
bestAsciiAttemptText = someLibrary.tryYourBestToConvertToAscii(someText)

ありがとうございました

4

3 に答える 3

1

UTF-8 としてデコードすると動作するはずです。

itemText = itemText.decode('utf-8')
于 2012-11-17T17:36:16.607 に答える
0

通常、文字を unicode または utf-8 として保持するようにしてください。情報が失われるため、文字をローカル コードページに変換しないでください。

ただし、必要な場合は、ここにあります。やるべきことはほとんどありません。サンプルキャラクターを使用しましょう:

>>> s = u'\u2013'

デバッグなどのために文字列を出力したい場合は、次を使用できますrepr

>>> print(repr(s))
u'\u2013'

インタラクティブ セッションでは、変数名を入力するだけで同じ結果が得られます。

>>> s
u'\u2013'

本当にテキストをローカル コードページに変換したい場合、およびこのコードページ外の文字が '?' に変換されても問題ない場合は、次のように使用できます。

>>> s.encode('latin-1', 'replace')
'?'

もしも '?' この回答translateのように、選択した文字を同等の文字に変換するために使用できます。

于 2013-03-11T22:38:40.730 に答える
-2

エンコーディングを明示的に宣言する必要がある場合があります。

ファイルの最初の行 (またはハッシュバンがある場合はその後) に、次の行を追加します。

-*- coding: utf-8 -*-

この「マジック コメント」は、Python に UTF-8 文字を想定させ、それらを正常にデコードする必要があります。

詳細: http://www.python.org/dev/peps/pep-0263/

于 2012-11-17T17:38:26.400 に答える