以字符串形式检索URL的内容

时间:2010-07-07 09:36:22

标签: ruby open-uri

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

我很亲密。我知道我需要使用OpenURI,它看起来应该是这样的:

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

有人可以建议我需要添加什么吗?

7 个答案:

答案 0 :(得分:54)

如果没有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'))

答案 1 :(得分:21)

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

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

答案 2 :(得分:11)

require 'open-uri'
open(url) do |f|
  page_string = f.read
end

另见IO class

的文档

答案 3 :(得分:4)

我也很困惑如何使用更好的性能和快速的结果。我为两者制定了基准,以使其更清晰:

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)

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:-1)

请尝试以下方法:

Person

答案 6 :(得分:-2)


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