以前有一个Hpricot,不过只能在Linux下使用,后来出现了一个Nokogiri,是Hpricot的良好替代品,且有Windows下的Gem,是编写蜘蛛的必备工具。
?
下面的代码是抓取红孩子网上商城的商品的代码,短小而精悍,充分显示了Nokogiri的强大
all = Nokogiri::HTML(open('http://www.redbaby.com.cn/'))
all.css('div.headSortBody_101015 div.thirdLevel ul li a').each do |a|
? url = a['href'].strip.delete("\n\t")
? begin
??? page = Nokogiri::HTML(open(url))
? rescue Exception=>err
??? p err
??? next
? end
? while page
??? page.css("div.listGoodsInner").each do |product|
????? begin
????????? p product.css("div.listGoodsName a").text.strip
????????? p product.css("div.listGoodsName a")[0]["href"]
????????? p product.css("div.listGoodsPic a img")[0]["src"]
????????? price = product.css("div.listGoodsPrice span.price02").text.strip
????????? price = price[3, price.size - 3].delete(',').to_f
????????? p price
????? rescue Exception => err
??????? p err
????? end
??? end
??? if page.css("a.right")[0] && page.css("a.right")[0]["href"]
????? page = Nokogiri::HTML(open("http://www.redbaby.com.cn/Product/" + page.css("a.right")[0]["href"].strip))
??? else
????? page = nil
??? end
? end
end
?
短短30行代码,就能把商城的所有商品都抓取下来,还能兼顾错误处理。
?
Nokogiri不单处理HTML简单快速,而且还是REXML的良好替代品,以前用Ruby处理XML时因为REXML采用Ruby语言编写,虽然简单,但是速度总是一个瓶颈,而Nokogiri的处理核心采用C语言编写,采用Nokogiri后处理速度将会有至少10倍以上的提高,从此Ruby处理XML再也没有任何可顾虑的了。
?
Nokogiri的网页地址:http://nokogiri.org/