試す環境は MacBook Air で。


$ uname -mrsv
Darwin 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386
 
$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
 
$ gem list | grep hpricot
hpricot (0.8.4, 0.6.164)
 
$ gem list | grep nokogiri
nokogiri (1.4.4)

サンプルコード。
Hpricot でも Nokogiri でもほぼ同じように使える。


$ cat ./ru.rb 
#!/usr/bin/env ruby
$KCODE='u'
 
require 'rubygems'
require 'hpricot'
require 'nokogiri'
require 'open-uri'
 
def doit(doc)
  begin
    (doc/:a).each{|elem|
      puts elem[:href]
    }
  rescue
    $stderr.puts $!.inspect
  end
end
 
url = 'http://www.nilab.info/z3/20110420_01.html'
doc1 = open(url)
doc2 = open(url)
 
puts '--- Hpricot ---------------------------'
doit(Hpricot(doc1))
 
puts '--- Nokogiri --------------------------'
doit(Nokogiri::HTML(doc2))

実行結果。


$ ruby ./ru.rb 
--- Hpricot ---------------------------
/z3/
20110417_01.html
20110420_01.html
http://www.bergen.de-blog.jp/
20110417_01.html
/
http://twitter.com/nilab
http://feed.mikle.com/
http://www.trackword.net/
http://my.trackword.net/u/nilab/1
http://my.trackword.net/u/nilab/2
http://my.trackword.net/u/nilab/3
http://my.trackword.net/u/nilab/4
http://my.trackword.net/u/nilab/5
http://www.nilab.info/lab/pure_diary/
--- Nokogiri --------------------------
/z3/
20110417_01.html
20110420_01.html
http://www.bergen.de-blog.jp/
20110417_01.html
/
http://twitter.com/nilab
http://feed.mikle.com/
http://www.trackword.net/
http://my.trackword.net/u/nilab/1
http://my.trackword.net/u/nilab/2
http://my.trackword.net/u/nilab/3
http://my.trackword.net/u/nilab/4
http://my.trackword.net/u/nilab/5
http://www.nilab.info/lab/pure_diary/

Ref.
- hpricot/hpricot - GitHub
- Nokogiri
- hpricotを使ってHrefだけ抜き出す - Rubyの魔神 - はてな?Rubyグループ
- pylori*style wiki - HTMLパーサ Hpricot
- HpricotからNokogiriに移行するときの罠(特にXML名前空間) - daily gimite
- お題目うぉっち:HpricotからNokogiriに乗り換え
- Nokogiri と Hpricot の違うとこ 2こ+(2009-06-09) - きたももんががきたん。
- Ruby Scraping - Hpricot/Showcase

tags: ruby html_parser hpricot nokogiri

Posted by NI-Lab. (@nilab)