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

AP2*_*257 24 ruby open-uri

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

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

require 'open-uri'
open(url) {
  # do something mysterious here to get page_string
}
puts page_string
Run Code Online (Sandbox Code Playgroud)

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

小智 55

没有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
Run Code Online (Sandbox Code Playgroud)

或者,更简洁:

Net::HTTP.get(URI.parse('http://www.google.com'))
Run Code Online (Sandbox Code Playgroud)

  • 使用open-uri有什么缺点? (11认同)
  • 复杂?这非常简单(你也可以在一行`Net :: HTTP.get(URI.parse('http://www.google.com'))`这样做.而且它不会在引擎盖. (5认同)
  • 是的,这个更复杂的答案比其他答案有更多的赞成,这是非常令人困惑的.我试着自己寻找一个理由,发现[这个问题/答案](http://stackoverflow.com/a/16764302/199712)似乎在大多数情况下推荐使用Net :: HTTP的OpenURI,这让事情更加混乱.谢谢,奥巴马 (4认同)
  • open-uri内部补丁`Kernel.open`.这是[文章](http://sakurity.com/blog/2015/02/28/openuri.html),讨论使用open-uri时应该注意的事项.当与其他库(如bunny gem(也实现`open`)一起使用时,我也遇到了方法命名冲突`open` (4认同)

Jer*_*iko 21

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

open([mode [, perm]] [, options]) [{|io| ... }] 
open(path) { |io| data = io.read }
Run Code Online (Sandbox Code Playgroud)


Teo*_*las 11

require 'open-uri'
open(url) do |f|
  page_string = f.read
end
Run Code Online (Sandbox Code Playgroud)

另请参阅IO类的文档


Gag*_*ami 5

我也很困惑使用什么来获得更好的性能和更快的结果。我为两者运行了一个基准测试以使其更清楚:

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
Run Code Online (Sandbox Code Playgroud)

它的结果是:

              user     system      total        real
net-http:  0.000000   0.000000   0.000000 (  0.097779)
open-uri:  0.030000   0.010000   0.040000 (  0.864526)
Run Code Online (Sandbox Code Playgroud)

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