在Ruby中解析网页的最佳方法是什么?

时间:2008-09-26 03:31:55

标签: html xml ruby screen-scraping

我一直在查看rubyforge上的XML和HTML库,以便将数据从网页中提取出来。例如,如果我想在stackoverflow上解析用户页面,我该如何将数据转换为可用的格式?

假设我想解析自己的用户页面以获取当前的信誉评分和徽章列表。我试图将从我的用户页面检索到的源转换为xml,但由于缺少div,转换失败。我知道我可以进行字符串比较并找到我正在寻找的文本,但必须有更好的方法来做到这一点。

我希望将其合并到一个简单的脚本中,该脚本在命令行中显示我的用户数据,并可能将其扩展为GUI应用程序。

6 个答案:

答案 0 :(得分:18)

不幸的是,stackoverflow声称是XML,但实际上并非如此。 Hpricot然而,可以将这个标签汤解析为元素树。

require 'hpricot'
require 'open-uri'

doc = Hpricot(open("http://stackoverflow.com/users/19990/armin-ronacher"))
reputation = (doc / "td.summaryinfo div.summarycount").text.gsub(/[^\d]+/, "").to_i

等等。

答案 1 :(得分:5)

尝试hpricot,好吧......真棒

我已多次使用它进行屏幕抓取。

答案 2 :(得分:5)

Hpricot is over !

立即使用 Nokogiri

答案 3 :(得分:0)

我总是非常喜欢Ilya Grigorik所写的内容,以及wrote up a nice post关于使用hpricot的内容。

我还有read this post一段时间后,它看起来对你有用。

我自己也没有,所以YMMV,但这些似乎非常有用。

答案 4 :(得分:0)

我之前尝试过这样做的事情是,很少有网页是格式良好的XML文档。 Hpricot可能能够解决这个问题(我还没有使用它)但是当我过去做一个类似的项目时(使用Python及其库的内置解析函数),它有助于有一个预处理器来清理它HTML。我使用HTML Tidy的python绑定作为这个,它使生活变得更容易。 Ruby绑定是here,但我还没有尝试过。

祝你好运!

答案 5 :(得分:0)

这似乎是一个古老的话题,但这里是一个新主题。获得声誉的示例:

#!/usr/bin/env ruby

require 'rubygems'
require 'hpricot'
require 'open-uri'

user = "619673/100kg"
html = "http://stackoverflow.com/users/%s?tab=reputation"

page = html % user
puts page

doc = Hpricot(open(page))
pars = Array.new
doc.search("div[@class='subheader user-full-tab-header']/h1/span[@class='count']").text.each do |p|
  pars << p
end

puts "reputation " + pars[0]