hakeの日記

Windows環境でプログラミングの勉強をしています。

Nokogiri - HTMLやXMLやSAXやXSLTやReaderのパーサ

NokogiriというHpricotより速いというHTML/XMLパーサを知り試してみました。Hpricotの使い方を忘れてしまったので、こちらのサンプルスクリプトを使用させていただきました(ただし毎回ネットに接続するとバラツキが大きかったのでファイルに落として、そこから読むように変更)
PCだと(速すぎて)あまり速度差がわかりませんでしたが、ザウルス上ではHpricotが6秒台なのに比べてNokogiriでは2秒足らずとかなり差がでました。

サンプルプログラム(dharryさんのスクリプトを少し変更)

#require 'rubygems'
#require 'hpricot'
require 'nokogiri'
#require 'open-uri'
require 'kconv'

## 岐阜 -> 秋田
#url = "http://transit.yahoo.co.jp/search/result?from=%E5%B2%90%E9%98%9C&to=%E7%A7%8B%E7%94%B0&via=&shin=1&ex=1&hb=1&al=1&ym=200810&d=29&hh=02&m1=1&m2=3&type=1&ost=0&ei=utf-8&x=59&y=5"
#File.open("test.html","w") do |f|
#f.write open(url).read
#end

url = ""
File.open("test.html") do |f|
  url = f.read
end



class YahooTransit
  def initialize(url)
    @url = url
    #@doc = Hpricot(@url)
    @doc = Nokogiri(@url)
    @parse_tag = "span[@class^='route-fare']"
  end
  def expense
    (@doc/@parse_tag).map {|elem| elem.inner_html.toutf8.gsub(/[^0-9]/,'') }.sort
  end
end

yt = YahooTransit.new(url)
puts yt.expense.join(",") #=> 30740,30830,31980

ザウルス用コンパイル(gcc4.2セルフコンパイル

Nokogiri

通常はインストールにRubygemsを使用するのですが、メモリ不足で落ちてしまったので直接コンパイルを実施、libxml2とlibxstlが必要(libxml2にはzlibがたぶん必要)
あと一部のファイルが生成できなかったのでPCから持ってきました、もしかしたら問題あるかも

libxml2とlibxstlのコンパイル
  • ソースはこちらから
  • configureで生成されたMakefile内のCFLAGSとLDFLAGSに-static-libgccを追加
  • libxstlに含まれるxslprocがlibgcc_s.soがスタティックにリンクされなかったので、そのディレクトリのMakefileも同様に書き換え
  • libtool内の"-shared"を"-shared -static-lingcc"に置換
    • libtoolのせいなのか判りませんが、make installで再度コンパイルし直すのにはマイッタ。なんとかならないものか。