我一直在浏览RubyForge上的XML和HTML库,寻找从网页中提取数据的简单方法。例如,如果我想解析stackoverflow上的用户页面,如何将数据转换为可用格式?
比如说,我想解析自己的用户页面,获取我的当前声望分数和徽章列表。我试图将从我的用户页面检索到的源代码转换为xml,但由于缺少div导致转换失败。我知道我可以进行字符串比较并找到我要查找的文本,但肯定有更好的方法。
我希望将其融入到一个简单的脚本中,以命令行方式输出我的用户数据,并可能扩展为GUI应用程序。
我一直在浏览RubyForge上的XML和HTML库,寻找从网页中提取数据的简单方法。例如,如果我想解析stackoverflow上的用户页面,如何将数据转换为可用格式?
比如说,我想解析自己的用户页面,获取我的当前声望分数和徽章列表。我试图将从我的用户页面检索到的源代码转换为xml,但由于缺少div导致转换失败。我知道我可以进行字符串比较并找到我要查找的文本,但肯定有更好的方法。
我希望将其融入到一个简单的脚本中,以命令行方式输出我的用户数据,并可能扩展为GUI应用程序。
很遗憾,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
等等类似的内容。
这似乎是一个老话题,但这里有一个新的例子:获取声望:
#!/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]