2009-12-06 48 views
10

我想從這個*頁面獲取內容。我查過的所有東西都提供瞭解析CSS元素的解決方案;但是,該頁面沒有。使用Ruby獲取網頁內容 - 我遇到問題

下面是我找到了一家看起來像它應該工作的唯一代碼:

file = File.open('http://hiscore.runescape.com/index_lite.ws?player=zezima', "r") 
contents = file.read 
puts contents 

錯誤:

tracker.rb:1:in 'initialize': Invalid argument - http://hiscore.runescape.com/index_lite.ws?player=zezima (Errno::EINVAL) 
    from tracker.rb:1:in 'open' 
    from tracker.rb:1 

* http://hiscore.runescape.com/index_lite.ws?player=zezima

如果試圖格式化這個鏈接中由於某些原因,它不能識別URL中的下劃線(_)。

回答

36

你真的想使用open()由可以從URI的閱讀內核類提供,你只需要要求OpenURI庫第一:

require 'open-uri' 

像這樣使用:

require 'open-uri' 
file = open('http://hiscore.runescape.com/index_lite.ws?player=zezima') 
contents = file.read 
puts contents 

這個相關的SO線程涵蓋了t他同樣的問題:

Open an IO stream from a local file or url

+0

我看到 - 不知道。儘管如此,取決於他想用這些內容來做什麼,他可能會更好用net/http。 – halfdan 2009-12-06 03:23:01

+0

噢,那更好。謝謝。 – Andrew 2009-12-06 04:32:05

+0

@halfdan - 完全同意net/http通常更好。我不依賴這種方法來處理任何非平凡/生產。 net/http有它的缺點,我通常更喜歡curl綁定(lib curb)。這篇文章有很好的關於http客戶端性能的信息 - http://bit.ly/lvriR curb非常棒,因爲你對超時進行了更精細的控制,這在大批量生產中非常關鍵。 – 2009-12-06 23:48:29

6

適當的方式來獲取網站的內容通過網:: HTTP模塊在Ruby中:

require 'uri' 
require 'net/http' 
url = "http://hiscore.runescape.com/index_lite.ws?player=zezima" 
r = Net::HTTP.get_response(URI.parse(url).host, URI.parse(url).path) 

File.open()不支持的URI。

最良好的祝願,
費邊

+0

GAWR,#1人是最酷的。謝謝! – Andrew 2009-12-06 03:14:10

+0

這不是正確的答案嗎? – 2013-02-11 11:17:50

6

請使用開放的URI,它同時支持URI和本地文件

require 'open-uri' 
contents = open('http://www.google.com') {|f| f.read }