PythonのUnicodeDecodeErrorの対処方法

提供: Python入門
2015年2月8日 (日) 12:25時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

PythonのHTMLParserを使用して、HTMLをパースしていたときに UnicodeDecodeError(ユニコード デコード エラー) のエラーに遭遇しました。UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)

読み方

UnicodeDecodeError
ゆにこーど でこーど えらー

概要

以下のエラーメッセージが出現しました。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6:
ordinal not in range(128)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)

エラーが起きたとき

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6:
ordinal not in range(128)

ASCII(アスキー)をデコードしようと思ったけど、できなかった、ということのようです。

プログラムを実行するとこのようになります。

$ python parse.py
Traceback (most recent call last):
  File "parse.py", line 210, in <module>
    parser.feed(html)
  File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed
    self.goahead(0)
  File "/usr/local/lib/python2.7/HTMLParser.py", line 148, in goahead
    k = self.parse_starttag(i)
  File "/usr/local/lib/python2.7/HTMLParser.py", line 252, in parse_starttag
    attrvalue = self.unescape(attrvalue)
  File "/usr/local/lib/python2.7/HTMLParser.py", line 393, in unescape
    return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)
  File "/usr/local/lib/python2.7/re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6:
 ordinal not in range(128)
Exit 1

解決方法

foo ( str );

なところを

foo ( str.decode('utf-8') );

とするだけで、解決しました。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)

エラーが起きたとき

出力をリダイレクトしない場合は、問題にならなかったのですが、リダイレクトした瞬間に

UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6:
ordinal not in range(128)

とエラーが出るようになりました。

% python ./parse.py < foo.txt
% python ./parse.py < foo.txt > bar.txt
Traceback (most recent call last):
  File "./parse.py", line 210, in <module>
    parser.feed(html.decode('utf-8') )
  File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed
    self.goahead(0)
  File "/usr/local/lib/python2.7/HTMLParser.py", line 150, in goahead
    k = self.parse_endtag(i)
  File "/usr/local/lib/python2.7/HTMLParser.py", line 319, in parse_endtag
    self.handle_endtag(tag.lower())
  File "./parse.py", line 128, in handle_endtag
    print self.expression, ",", self.meaning,
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)
Exit 1

解決方法

出力先が端末、ファイルに関わらず、特定のエンコーディングで出力したい場合は、標準出力で書き換えてしまうのが簡単です。

import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

関連項目




スポンサーリンク