ページ

2010年12月6日

Pythonで文字コード判定

昔のトラウマのせいか、文字コードの自動判定はあまり信用していません。できることなら、あまりやりたくないものです。でも、今遊んでいる、じゃなかった作っているものでできれば文字コードを自動判定したくなることもあります。扱っているのはWebページでHTMLです。なので、大抵の場合はHTMLの中に文字コードが書いているので、おそらくそれは信用してもいいでしょう。
HTMLの中に文字コードが書いていない場合は、ちょっと困ります。HTTPヘッダーに文字コードが書かれていればそれを信用するかどうかが迷うところです。あんまり信用したくありません。でも、大きなところではYahoo!Japanのニュースのブログ/意見は文字コードはHTMLにかいていません。HTTPヘッダーにはちゃんと指定してあります。でも、これはYahoo!Japanだからかな。
で仕方なく文字コードの自動判定に落ち着く訳です。Pythonで文字コードの自動判定って何がいいのか、Googleさんに聞くと、Universal Encoding Detectorにしなさいとおっしゃいます。feedparser作っているとこですね。他のはpykfなど日本語に特化したものとかありましたが、日本語だけに特化しているのはちょっとさけたかったので、お告げに従いました。pip install chardetでインストールして、試してみます。手もとにあるちょっといやんなサイトのリストをまわしてみるとちゃんと判定してくれています。こんな感じ。
import chardet
import urllib2

my_urls = [...省略...]
for url in my_urls:
    res = urllib2.urlopen(url)
    print chardet.detect(res.read())

先ほどのYahoo!の場合だと{'confidence': 0.98999999999999999, 'encoding': 'EUC-JP'}と出力されます。確かにあってます。
IBMの文字コードの自動判定するライブラリと比べると、多分100%はあり得ないと思っているので、候補をリストで出してくれたり、フォールバック先を指定できたりするとうれしいかな。フォールバック先はconfidenceの値をみて、閾値以下だと自分でフォールバック先のエンコーディングを使用すればいいのかな?

0 件のコメント: