由于使用Hpricot的繁琐原因,我需要编写一个函数,该函数传递一个URL,并将页面的全部内容作为单个字符串返回。我知道我需要使用OpenURI,它应该看起来像这样:
require 'open-uri' open(url) { # do something mysterious here to get page_string } puts page_string
有人能建议我需要补充什么吗?
xesrikrc1#
如果没有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'))
vcudknz32#
open方法在块产生时将资源的IO表示传递给块。
open
IO
open([mode [, perm]] [, options]) [{|io| ... }] open(path) { |io| data = io.read }
xjreopfe3#
require 'open-uri' open(url) do |f| page_string = f.read end
另请参见IO class的文档
wn9m85ua4#
我也很困惑该用什么来获得更好的性能和更快的结果。我运行了一个基准来让它更清晰:
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)
我想说,这取决于你的要求是什么,以及你想如何处理。
jljoyd4f5#
为了让代码更清晰一些,OpenURI open方法将返回块返回的值,因此您可以将open的返回值赋给您的变量。例如:
xml_text = open(url) { |io| io.read }
o0lyfsai6#
从Ruby 3.0开始,通过Kernel#open调用URI.open的操作已经被删除,因此改为直接调用URI.open:
Kernel#open
URI.open
require 'open-uri' page_string = URI.open(url, &:read)
0lvr5msh7#
请尝试以下方法:
require 'open-uri' content = URI(your_url).read
hwazgwia8#
require 'open-uri' open(url) {|f| #url must specify the protocol str = f.read() }
8条答案
按热度按时间xesrikrc1#
如果没有OpenURI,您也可以这样做:
或者,更简洁地说:
vcudknz32#
open
方法在块产生时将资源的IO
表示传递给块。xjreopfe3#
另请参见IO class的文档
wn9m85ua4#
我也很困惑该用什么来获得更好的性能和更快的结果。我运行了一个基准来让它更清晰:
其结果是:
我想说,这取决于你的要求是什么,以及你想如何处理。
jljoyd4f5#
为了让代码更清晰一些,OpenURI
open
方法将返回块返回的值,因此您可以将open
的返回值赋给您的变量。例如:o0lyfsai6#
从Ruby 3.0开始,通过
Kernel#open
调用URI.open
的操作已经被删除,因此改为直接调用URI.open
:0lvr5msh7#
请尝试以下方法:
hwazgwia8#