Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

htmlをプレーンテキスト化するPythonスクリプトでハマったこと

htmlをプレーンテキストにしたいなぁとググっていると
html2text.py HTMLをプレーンテキストに: つちのこ、のこのこ。
こちらのhtml2text.pyが小さめで便利そうです。
しかしハマる点があります。

ハマった点

対象のhtmlによってはUnicodeDecodeErrorがでます。

UnicodeEncodeError: 'utf8' codec can't encode characters in position...

読み込んだhtmlをUnicode型に直して処理しているんですが、デコードする文字コードutf-8に固定してるので、htmlがそれ以外の文字コード(euc-jpとか)のときにエラーがでます。

解法

取得したhtmlの文字コードを調べないといけません。
こちらを参考にすれば取得出来ました
2008/05/20 文字コード判定して一括でuft-8に変換するPythonスクリプト - 清水川Web
あとは動的に文字コードを指定してやればいいです。
変更点としては

if __name__=='__main__':
...
    title, text = convert(unicode(u.read(), 'utf-8'), indent=' '*3)

# 文字コードを判定する
def guess_charset(data):
...

if __name__=='__main__':
...
    t = u.read()
    c = guess_charset(t)
    title, text = convert(unicode(t, c), indent=' '*3)

こんなかんじです。

Unicode型とか、どっちがエンコードでどっちがデコードか分からんってときは
http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html
ここを参考に。

最後に

htmlの頭にエンコードの種類が書いてあると思うので、そこから取った方が良いかと思います。
ですがhtmlをプレーンテキストに直す必要が無くなったので、その方法は試してないです。