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()

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