以字符串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() }