我正在尝试使用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
保存在某种形式的树状结构中,我可以用它来深入研究,但我的里程数会有所不同。
答案 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来阻止窗口打开。