2012-12-09 84 views
1

我試圖使用從引入nokogiri解析a bit.ly stats page Twitter的用戶名:如何使用Nokogiri解析bit.ly統計頁面?

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

你確定有推文嗎?當我運行上面的代碼並檢查文檔時,我沒有看到任何內容。 –

+0

我正在看推文Eric Walker。 – sunnyrjuneja

+0

你在你的'shares.map'循環中濫用'map'。它應該是'shares.each'來代替。 –

回答

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以防止打開窗口。

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']} 

我得到的URL通過加載在Chrome的頁面,然後在看網絡面板,我也刪除了時間戳和回調參數僅僅爲了收拾了一點東西。

+0

這是一個明智的解決方案,但我不認爲我有辦法自動檢索該Ajax請求,而無需在網絡面板中手動查找。是對的嗎?這在你需要'open-uri':)時有效:) –

+0

當然。要在腳本中構造url,只需在原始請求中查找q param(nowness ...)的值並將其添加到其餘部分。 – pguardiario