1

我正在尝试使用 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某种形式的树结构保存,我可以用它来深入研究,但我的里程是不同的。

4

2 回答 2

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

于 2012-12-09T09:04:42.183 回答
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来防止窗户打开。

于 2012-12-09T06:54:24.647 回答