2009-12-06 104 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 }