由于与 Hpricot 相关的繁琐原因,我需要编写一个传递 URL 的函数,并将页面的全部内容作为单个字符串返回。
快到了。我知道我需要使用 OpenURI,它应该看起来像这样:
require 'open-uri'
open(url) {
# do something mysterious here to get page_string
}
puts page_string
谁能建议我需要添加什么?
你可以在没有 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'))
该open
方法在产生IO
时将资源的表示传递给您的块。您可以使用该IO#read
方法从中读取
open([mode [, perm]] [, options]) [{|io| ... }]
open(path) { |io| data = io.read }
require 'open-uri'
open(url) do |f|
page_string = f.read
end
另见IO 类的文档
我也很困惑使用什么来获得更好的性能和快速的结果。我对两者都进行了基准测试以使其更加清晰:
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)
我想说这取决于你的要求是什么以及你想如何处理。
为了使代码更清晰一点,OpenURIopen
方法将返回块返回的值,因此您可以将open
的返回值分配给您的变量。例如:
xml_text = open(url) { |io| io.read }
不推荐使用URI.open
via调用(在 Ruby 3.0 下,它已被删除),因此直接调用:Kernel#open
URI.open
require 'open-uri'
page_string = URI.open(url, &:read)
请尝试以下操作:
require 'open-uri'
content = URI(your_url).read
require 'open-uri'
open(url) {|f| #url must specify the protocol
str = f.read()
}