1. ホーム
  2. python

[解決済み] UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

2022-02-18 23:46:17

質問

異なるウェブページ(異なるサイト)から取得したテキストからUnicode文字を扱うのに問題があります。私はBeautifulSoupを使用しています。

問題は、エラーの再現性が低いことで、あるページでうまくいくこともあれば、あるページでは UnicodeEncodeError . 思いつく限りのことを試してみましたが、ユニコード関連の何らかのエラーを出さずに安定して動作するものはまだ見つかっていません。

問題を引き起こしているコードのセクションの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)

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

どなたか、この問題を解決する方法をご存知の方はいらっしゃいますか?

解決方法は?

Pythonを読む必要があります。 ユニコードHOWTO . このエラーは 最初の例 .

基本的に str を使用して、Unicodeからエンコードされたテキスト/バイトに変換します。

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

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

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