- 2008-06-17 (Tue) 4:00
- Programming | 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だしなぁ・・・。
- Newer: その一瞬が何もかもだと あなたは教えてくれた人
- Older: 風邪引いた 2

Pingback: cocoa*life » Rubyで自動的にリンクを拾ってくるツールを作ったのだが・・・ 2
Pingback: Recent URLs tagged Hpricot - Urlrecorder