UnicodeEncodeError: 'ascii' コーデックは位置 20 の文字 u'\xa0' をエンコードできません: 序数が範囲外です (128) 質問する

UnicodeEncodeError: 'ascii' コーデックは位置 20 の文字 u'\xa0' をエンコードできません: 序数が範囲外です (128) 質問する

異なる 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)

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

この問題を一貫して解決できる方法について、何かアイデアをお持ちの方はいらっしゃいますか?

ベストアンサー1

Pythonを読むユニコードの使い方このエラーは最初の例

str()Unicode からエンコードされたテキスト/バイトへの変換には使用しないでください。

代わりに、.encode()文字列をエンコードするには:

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

または完全に Unicode で動作します。

おすすめ記事