Hpricotでタグ名を書き換える

Hpricotとは、rubyのhtmlパーサです。
これを使って、タグ名を書き換える時にわかったことをメモします。

タグ名を書き換える

例えば、html内のすべてthタグをtdタグに書き換えます。

require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open'http://example.co.jp/')

(doc/:th).each do |tag|
  #puts tag.name #=>'th'
  tag.name = 'td'
end

puts doc

「.name」でタグ自体の名前を得ることができます。
チュートリアルには、idやclassの検索方法は書いてあったのですが
これが分からず手こずってしまいました。


追記(12/16):.nameでタグを書き換えられると書きましたが、これだと開くタグはできますが閉じるタグが書き換えられないことに気付きました。
そこで、オフィシャルのチュートリアルhttp://code.whytheluckystiff.net/hpricot/wiki/HpricotAltering)にあった
swapメソッドを使って強引に書き換えてみることにしました。

require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open'http://example.co.jp/')

(doc/:th).each do |tag|
  tag.swap("<td>" + td.inner_text + "</td>")
end

puts doc

要素の中身のテキストだけを得る

あとチュートリアルで役立ったこともメモしておきます。


例えば下のようなhtmlを検索する場合

<th><b>ホゲ</b></th>

inner_htmlだと

(doc/:th).inner_html
#=> "<b>ホゲ</b>"

となりますが、inner_textを使うと

(doc/:th).inner_text
#=> "ホゲ"

と中身のテキストだけを得ることができます。


よって

<th><b>ホゲ</b>または<b>hoge</b></th>

だと

(doc/:th).inner_text
#=> "ホゲまたはhoge"

となります。

Hpricotについて

オフィシャルページ

Hpricot A Fast, Enjoyable HTML Parser for Ruby
http://code.whytheluckystiff.net/hpricot/