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

14

我一直在浏览RubyForge上的XML和HTML库,寻找从网页中提取数据的简单方法。例如,如果我想解析stackoverflow上的用户页面,如何将数据转换为可用格式?

比如说,我想解析自己的用户页面,获取我的当前声望分数和徽章列表。我试图将从我的用户页面检索到的源代码转换为xml,但由于缺少div导致转换失败。我知道我可以进行字符串比较并找到我要查找的文本,但肯定有更好的方法。

我希望将其融入到一个简单的脚本中,以命令行方式输出我的用户数据,并可能扩展为GUI应用程序。


不想泼你的冷水,但最优秀的http://modos.org/sof/?u=???(其中 ??? 是你的 ID,对于你来说是 22423)可能已经实现了你想要的功能。请参阅http://stackoverflow.com/questions/61553/track-your-reputation 以获取更多详细信息。 - SCdF
6个回答

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

等等类似的内容。


5

5

试试Hpricot,它很棒。

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


0

我一直很喜欢Ilya Grigorik的写作,他写了一篇不错的文章关于使用hpricot。

我之前也读过这篇文章,看起来对你会有用。

虽然我自己没有尝试过,但这些工具似乎非常实用。


0

我之前尝试过这个,遇到的问题是很少有网页是格式良好的XML文档。Hpricot可能能够处理它(我没有使用过),但是在过去进行类似项目时(使用Python及其库内置的解析函数),使用预处理器清理HTML有所帮助。我使用了HTML Tidy的Python绑定,这使得生活变得更加轻松。Ruby绑定在这里,但我没有尝试过。

祝你好运!


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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接