Pages

November 05, 2010

UnicodeEncodeError: 'ascii' codec...が出てしまった。

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

Pyscripterの環境で弄くり回していたのだが、↑のようなエラーが吐かれました。

よく分からないことにPythonインタプリタに直接投げた場合はそのようなエラーは吐かれないんですよね。

で、

問題解決しました。

凡ミスというか、恥ずかしいミス。

Pathにマルチバイトコードが入っていたんですね。

ディレクトリ名やファイル名に日本語等の名前をつけちゃうと起こるみたいです。

で、

なんでなったのかというと。

普段からファイル名やディレクトリ名にはマルチバイト使わないようにしてるのですが、

ちょっとしたことからいつも保存している場所から別の場所に保存していて、それに気づかなかったという落ちでした。

気づくまでに時間掛かりましたよ。

ええ。



うん、こーいう問題は俺だけじゃなくて他の人もやってしまってる見たいですよ。

こちらにその指摘があります。(ソース)

でもさ、Pyscripterさんもそのへん放置しないでさ。何とかしてくださいよ…

November 04, 2010

BeautifulSoupでHTMLParseErrorが起きた時の対処

BeautifulSoupでスクレイピングしていたとき、「bad end tag: u""」というHTMLParseErrorが起きてしまった。

これから研究でぶち当たっていきそうなのでとりあえずメモ。


結果から言うと単純に例外処理で該当部分を書き換えてしまえばいいのだ。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2
from BeautifulSoup import BeautifulSoup
from HTMLParser import HTMLParseError

def fix_html(html):
    #UTF8に強制変換
    html = html.encode("utf-8")
    try:
        soup = BeautifulSoup(html)
        return soup
    except HTMLParseError,e:
        emsg = e.msg
        #無理矢理、問題の該当箇所を抽出し空文字列に置換
        emsg_start = emsg.find('u"')
        rpl_str = eval(emsg[emsg_start:]).encode("utf-8")
        html = html.replace(rpl_str,u"")
        #再帰的処理
        return fix_html(html)
    except e:
        raise e

def main():
    try:
     set_url = "#適宜URLを"
     html = urllib2.urlopen(set_url).read()
        print fix_html(html)
    except urllib2.HTTPError, e:
     e.code, e.msg
     print "%s is not existed." % set_url

if __name__ == '__main__':
    main()


こんな感じだろうか。
やってはいけないことをしています。それは問題箇所を無理矢理抽出して置換していることです。
なにか良い方法あると思いますが、考えつかなかったのでこんなかんじにしちゃいました^^;