我如何使用Nokogiri解析一个bit.ly统计页面?

时间:2012-12-09 04:32:15

标签: ruby nokogiri bit.ly

我正在尝试使用Nokogiri从a bit.ly stats page解析Twitter用户名:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://bitly.com/U026ue+/global'))

twitter_accounts = []

shares = doc.xpath('//*[@id="tweets"]/li')

shares.map do |tweet|
  twitter_accounts << tweet.at_css('.conv.tweet.a')
end

puts twitter_accounts

我的理解是,Nokogiri会将shares保存在某种形式的树状结构中,我可以用它来深入研究,但我的里程数会有所不同。

2 个答案:

答案 0 :(得分:4)

该数据来自带有JSON响应的Ajax请求。虽然很容易上手:

require 'json'
url = 'http://search.twitter.com/search.json?_usragnt=Bitly&include_entities=true&rpp=100&q=nowness.com%2Fday%2F2012%2F12%2F6%2F2643'
hash = JSON.parse open(url).read
puts hash['results'].map{|x| x['from_user']}

我通过在Chrome中加载页面然后查看网络面板来获取该URL,我还删除了时间戳和回调参数,只是为了清理一点。

答案 1 :(得分:2)

实际上,Eric Walker正在做点什么。如果您查看doc,推文应该是这样的部分:

<h2>Tweets</h2>
  <ul id="tweets"></ul>
</div>

这可能是因为它们是由Nokogiri没有执行的一些JavaScript调用生成的。一种可能的解决方案是使用watir遍历页面,加载JavaScript然后保存HTML。

这是一个完成该操作的脚本。请注意,您已经解决了XPath参数的一些问题,并且每次运行此脚本时,watir都会打开一个新的浏览器:

require 'watir'
require 'nokogiri'

browser = Watir::Browser.new
browser.goto 'http://bitly.com/U026ue+/global'

doc = Nokogiri::HTML.parse(browser.html)

twitter_accounts = []

shares = doc.xpath('//li[contains(@class, "tweet")]/a')

shares.each do |tweet|
  twitter_accounts << tweet.attr('title')
end

puts twitter_accounts
browser.close

您还可以使用headless来阻止窗口打开。