以字符串forms检索URL的内容

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

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

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

任何人都可以建议我需要添加什么吗?

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

 open([mode [, perm]] [, options]) [{|io| ... }] open(path) { |io| data = io.read } 

没有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 
 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) 

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

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

 xml_text = open(url) { |io| io.read } 

请尝试以下方法:

 require 'open-uri' content = URI(your_url).read 
 require 'open-uri' open(url) {|f| #url must specify the protocol str = f.read() }