添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
鼻子大的苹果  ·  UnicodeDecodeError: ...·  2 周前    · 
面冷心慈的松球  ·  父约束 (Parent ...·  5 天前    · 
风度翩翩的莲藕  ·  李代沫吸毒被抓 ...·  5 月前    · 
玩足球的夕阳  ·  王俊·  5 月前    · 
捣蛋的土豆  ·  Python Web Scraping ...·  5 月前    · 
调皮的草稿纸  ·  GitHub - ...·  9 月前    · 

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

UnicodeDecodeError
ゆにこーど でこーど えらー
  • 1 概要
  • 2 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
  • 2.1 エラーが起きたとき
  • 2.2 解決方法
  • 3 UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)
  • 3.1 エラーが起きたとき
  • 3.2 解決方法1
  • 3.3 解決方法2
  • 4 関連項目
  • 以下のエラーメッセージが出現しました。

    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

    解決方法1

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

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

    解決方法2

    解決方法1で解決しなかった場合は、コードの変更はなく、環境変数を設定するだけで対応できました。

    env LC_ALL=en_US.UTF-8 /usr/bin/python ./doit.py