31

由于与 Hpricot 相关的繁琐原因,我需要编写一个传递 URL 的函数,并将页面的全部内容作为单个字符串返回。

快到了。我知道我需要使用 OpenURI,它应该看起来像这样:

require 'open-uri'
open(url) {
  # do something mysterious here to get page_string
}
puts page_string

谁能建议我需要添加什么?

4

8 回答 8

61

你可以在没有 OpenURI 的情况下做同样的事情:

require 'net/http'
require 'uri'

def open(url)
  Net::HTTP.get(URI.parse(url))
end

page_content = open('http://www.google.com')
puts page_content

或者,更简洁地说:

Net::HTTP.get(URI.parse('http://www.google.com'))
于 2010-07-07T09:50:51.437 回答
22

open方法在产生IO时将资源的表示传递给您的块。您可以使用该IO#read方法从中读取

open([mode [, perm]] [, options]) [{|io| ... }] 
open(path) { |io| data = io.read }
于 2010-07-07T10:00:46.810 回答
12
require 'open-uri'
open(url) do |f|
  page_string = f.read
end

另见IO 类的文档

于 2010-07-07T09:50:41.933 回答
5

我也很困惑使用什么来获得更好的性能和快速的结果。我对两者都进行了基准测试以使其更加清晰:

require 'benchmark'
require 'net/http'
require "uri"
require 'open-uri'

url = "http://www.google.com"
Benchmark.bm do |x|
  x.report("net-http:")   { content = Net::HTTP.get_response(URI.parse(url)).body if url }
  x.report("open-uri:")   { open(url){|f| content =  f.read } if url }
end

其结果是:

              user     system      total        real
net-http:  0.000000   0.000000   0.000000 (  0.097779)
open-uri:  0.030000   0.010000   0.040000 (  0.864526)

我想说这取决于你的要求是什么以及你想如何处理。

于 2015-05-20T07:32:32.573 回答
4

为了使代码更清晰一点,OpenURIopen方法将返回块返回的值,因此您可以将open的返回值分配给您的变量。例如:

xml_text = open(url) { |io| io.read }
于 2014-07-21T19:09:44.320 回答
1

不推荐使用URI.openvia调用(在 Ruby 3.0 下,它已被删除),因此直接调用:Kernel#openURI.open

require 'open-uri'
page_string = URI.open(url, &:read)
于 2021-11-21T07:12:32.980 回答
-1

请尝试以下操作:

require 'open-uri' 
content = URI(your_url).read
于 2015-10-30T12:14:23.800 回答
-2

require 'open-uri'
open(url) {|f|  #url must specify the protocol
str = f.read()
}
于 2010-07-07T09:56:04.580 回答