1428

別の Web ページ (別のサイト) から取得したテキストからの Unicode 文字の処理に問題があります。BeautifulSoupを使用しています。

問題は、エラーが常に再現できるとは限らないことです。一部のページで動作することもあれば、UnicodeEncodeError. 考えられることはすべて試してみましたが、何らかの Unicode 関連のエラーをスローせずに一貫して動作するものは見つかりませんでした。

問題を引き起こしているコードのセクションの 1 つを以下に示します。

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

上記のスニペットを実行したときに、一部の文字列で生成されるスタック トレースを次に示します。

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

これは、一部のページ (より具体的には、一部のサイトのページ) がエンコードされている可能性があり、他のページがエンコードされていない可能性があるためだと思われます. すべてのサイトは英国に拠点を置いており、英国での消費を目的としたデータを提供しているため、英語以外で書かれたテキストの内部化や処理に関連する問題はありません.

この問題を一貫して修正できるように、これを解決する方法について何か考えがある人はいますか?

4

34 に答える 34

1473

Python Unicode HOWTOを読む必要があります。このエラーは最初の例です。

基本的に、strユニコードからエンコードされたテキスト/バイトに変換するために使用するのはやめてください。

代わりに、適切に使用.encode()して文字列をエンコードします。

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

または完全にユニコードで動作します。

于 2012-03-30T12:21:31.160 に答える
470

これは古典的なPythonユニコードの問題点です!次のことを考慮してください。

a = u'bats\u00E0'
print a
 => batsà

これまでのところすべて良好ですが、str(a)を呼び出すと、何が起こるか見てみましょう。

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

ああ、それは誰にも何の役にも立たないだろう!エラーを修正するには、バイトを.encodeで明示的にエンコードし、使用するコーデックをPythonに指示します。

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

ボイル\u00E0!

問題は、str()を呼び出すと、Pythonがデフォルトの文字エンコードを使用して、指定したバイトをエンコードしようとすることです。この場合、Unicode文字の表現である場合があります。この問題を修正するには、.encode('whatever_unicode')を使用して、指定した文字列を処理する方法をPythonに指示する必要があります。ほとんどの場合、utf-8を使用すれば問題ありません。

このトピックに関する優れた解説については、Ned BatchelderのPyConトークを参照してください:http://nedbatchelder.com/text/unipain.html

于 2012-03-30T12:25:08.317 に答える
237

シンボルを削除し、文字列を文字列として保持し続けるためのエレガントな回避策を次のように見つけました。

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

ここで見られるように、無視オプションを使用すると、それを使用するコードから Unicode (および国際化) サポートが暗黙のうちに削除されるため、危険であることに注意することが重要です (Unicode の変換):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
于 2014-08-20T10:13:15.407 に答える
101

印刷さえ失敗する微妙な問題は、環境変数の設定が間違っていることです。ここでは LC_ALL を "C" に設定します。Debian では、それを設定することをお勧めしません: Debian wiki on Locale

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà
于 2013-12-02T17:58:15.743 に答える
34
于 2015-08-13T12:07:04.140 に答える
28

私にとって、うまくいったのは:

BeautifulSoup(html_text,from_encoding="utf-8")

これが誰かに役立つことを願っています。

于 2015-01-26T14:53:34.127 に答える
28

実際、ほとんどの場合、これらの文字を削除する方がはるかに簡単であることがわかりました。

s = mystring.decode('ascii', 'ignore')
于 2013-11-01T13:44:36.433 に答える
16

スクリプトの先頭 (または 2 行目) に以下の行を追加します。

# -*- coding: utf-8 -*-

これが Python のソース コード エンコーディングの定義です。詳細はPEP 263を参照してください。

于 2016-08-08T10:17:31.143 に答える
7

ここにある単純なヘルパー関数。

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')
于 2015-12-31T07:57:50.447 に答える
4

以下の解決策は私のために働いた、ちょうど追加した

u「文字列」

私の文字列の前に(文字列をユニコードとして表す)。

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)
于 2017-11-01T21:58:30.773 に答える
3

推奨された解決策は私にはうまくいきませんでした.ASCII以外のすべての文字をダンプしても問題ありませんでした。

s = s.encode('ascii',errors='ignore')

エラーをスローしない何かが取り除かれました。

于 2020-03-26T19:34:18.723 に答える
0

UTF-8スクリプトを実行する前に、文字エンコーディングを次のように設定できます。

export LC_CTYPE="en_US.UTF-8"

通常、これで問題は解決します。

于 2021-05-07T14:27:06.883 に答える