Rubyで自動的にリンクを拾ってきてくるツールを作ったのだが・・・

とある目的のため、Rubyで自動的にリンクをたどって、HTMLファイルを解析し、必要となるリンクを抜き出してきてくれるツールを作った。

基本的にはNet::HTTPを使ってresponseをgetし、response.bodyで中身のHTMLファイルが取得できるので、あとはHTMLパーサーにかけるだけである。

HTMLパーサーにはhpricotというものを使った。
Hpricot, a fast and delightful HTML parser

これで非常に簡単にリンクが取得できる。
たとえば(たぶん)こんな風に(いい加減、ブログにアップロードするときにコードに色をつけてくれるのが欲しいな)。

require "rubygems"
require "hpricot"
require "net/http"

url = ARGV[0]

Net::HTTP.start(url) { |http|
  response = http.get(hoge)
  
  doc = hpricot(response.body)
  (doc/:a).each { |link|
    p(link[:href])
  }
}

実際に動かしてみると、何かが遅くて1時間ぐらい経っても?(放置していたので正確な時間がわからない)終わっていない(挙げ句の果てには、#<eoferror : end of file reached>とはき出して死んでいたのだが(笑))。

プロファイルしてみないとわからないけれども、ネットワークが遅いのか、Rubyが遅いのか、HTMLのパースが遅いのかのどれかだと思う。
ただ、hpricotはCでバックエンドが書かれているようなので、ここが遅いというのは考えにくいのかも。

こうなったらC++で書くしかないのか?
でも文字列処理が面倒 + httpを扱うものを書いたことがないということで(boost::asioで解決できるかな)、できる限り使いたくはないのだけれど。
しかも元々のHTMLはEUC-JPだしなぁ・・・。