Hpricotを使って、文字列に含まれるHTMLタグを取得

先輩にHpricotというライブラリを教えて頂いたので、これを使ったモジュールを作ってみました。

やりたいこと
  • 特定のタグ以外は非推奨タグとする
  • 文字列strに含まれるHTMLタグを調べる
  • 非推奨タグが含まれていたら、その部分(開始タグ〜終了タグの文字列)を配列化する
require 'hpricot'

module HtmlTag
  AVAILABLE_TAGS = ['b', 'u', 'a', 'span']

  def search_unrecommended_tags(str)
    doc = Hpricot(str)
    unrecommended_tags = []

    AVAILABLE_TAGS.each do |tag|
      (doc/tag).remove
    end
    # 非推奨でないタグは取り除く

    (doc/"*").each do |h|
      unrecommended_tags << h.to_original_html if (h.class == Hpricot::Elem)
    end
    # docオブジェクトのうち、HTMLタグが使われている部分を配列化

    unrecommended_tags
  end
end
ポイント

http://mono.kmc.gr.jp/~yhara/rubyscraping/?Hpricotにある通り、Hpricot::Docオブジェクトの構成要素には、次のクラスがあるようです。

    • Hpricot::Elem(HTMLの開始タグ + HTMLタグに囲まれている文字列 + HTMLの終了タグ)
    • Hpricot::Text(HTMLタグに囲まれていない文字列)
    • Hpricot::Comment(コメント)


HTMLタグが使われている部分だけを取り出すには、各要素についてHpricot::Elemクラスかどうかを見ればよい、というわけです。