nokogiriを入れてみた
そういえばと思って検索してみたRubyのXML/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>