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