nokogiriを入れてみた

そういえばと思って検索してみたRubyXML/HTMLパーザライブラリ「Nokogiri」が、実はHpricotよりもイケてるらしい。入れてみた。

手元のUbuntu 8.04の環境だとlibxml2とlibxlstの開発用ヘッダファイルが別途インストールする必要があった。

% sudo aptitude install libxml2-dev

% sudo aptitude install libxslt-dev

% sudo gem install nokogiri

Building native extensions.  This could take a while...
Successfully installed nokogiri-1.3.2
1 gem installed
Installing ri documentation for nokogiri-1.3.2...
Installing RDoc documentation for nokogiri-1.3.2...

irbでドキュメントを読み込んで遊ぶのも簡単っぽい。

% irb
>>
>> require 'nokogiri'
=> true
>> require 'open-uri'
=> true
>> doc = Nokogiri(open("http://twitter.com/statuses/friends/[usesrname].xml"))
=> <?xml version="1.0" encoding="UTF-8"?>
<users type="array">
<user>
  <id>49540955</id>
  <name>毎日jp編集部</name>
  :
  :
  :

>> (doc./"friends_count").class
=> Nokogiri::XML::NodeSet

>> (doc./"friends_count").each do |i| puts i end
<friends_count>5</friends_count>
<friends_count>487</friends_count>
<friends_count>1295</friends_count>
<friends_count>79</friends_count>
<friends_count>147</friends_count>
 :
 :
>> (doc./"friends_count").each do |i| puts i.text.to_i end
92
59
396
294
236
300
160
646
136
1682
178
617
 :
 :
=> 0
>> (doc./"friends_count").find_all{|i| i.text.to_i > 100}
=> [<friends_count>487</friends_count>, <friends_count>1295</friends_count>,
<friends_count>147</friends_count>, <friends_count>1664</friends_count>,
<friends_count>236</friends_count>, <friends_count>872</friends_count>,
<friends_count>573</friends_count>, <friends_count>140</friends_count>,
<friends_count>425</friends_count>, <friends_count>369</friends_count>,
<friends_count>220</friends_count>, <friends_count>1033</friends_count>,
<friends_count>151</friends_count>, <friends_count>265</friends_count>,
<friends_count>472</friends_count>,
:
:

確かにノコギリで切り刻む印象だ。nokogiriは、HTMLを組み立てたりもできる。

require 'nokogiri'
puts Nokogiri{
  html{
    body{
      h1{text "Hello, World" }
      p{text "This is the 1st sentence."}
      ul{
        li{text "Japan"}
        li{text "Jamaica"}
      }
    }
  }
}
(html.rb)
% ruby html.rb
<html><body>
<h1>Hello, World</h1>
<ul>
<li>Japan</li>
<li>Jamaica</li>
</ul>
</body></html>