HTMLかどうかの判定にbodyだけでなくheaderも使う話

※ 実際には8月22日のできごと。

あるテキストデータが HTML かどうか(プレインテキストでないかどうか)を判別する処理の話で、

Hpricot を使っていたときはこう書いていた。

d = Hpricot( src )
d.inspect.include?( 'elem' )

これは Hpricot が

{elem {elem ...

って感じで要素の階層構造を表現してくれることに依存してるんだけど、あまりに乱暴かつ Nokogiri の場合はそっけなく

Nokogiri::XML::Document

だということしか分からないのでどうしようかと思っていた。で、どうしようって Twitter でつぶやいて返事をもらった瞬間に、

どうせ open-uri で取得したものなんだからメタデータで判別すればいいじゃん

と気づいたので、

.meta['content-type']

で確認するようにしてみた。これなら Hpricot か Nokogiri かに関わらず使える。うむ。なんて簡単なことだったのだ。

というわけで実際にできたのはこれ。

Commit 0ce737eb55f968a22f143244a3e7fbf8adf0d34f to wtnabe/pukiassist - GitHub

中身だけで判断しなければいけなくなったときが来たらそのとき考えよう。ちなみに、 /<html/i で判別する方法もなくはないんだけど、データの中に入ってくる可能性もあるかと思って却下としました。ないかもしんないけど、心配したくないしね。

More