如何使用 Nokogiri 解析 bit.ly 统计信息页面



我正在尝试使用Nokogiri从 bit.ly 统计页面解析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,我可以用来深入研究,但我的里程各不相同。

该数据来自带有 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,我还删除了时间戳和回调参数,只是为了稍微清理一下。

实际上,埃里克·沃克(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

您还可以使用无头来防止窗口打开。

相关内容

  • 没有找到相关文章

最新更新