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

8hhllhi2  于 2022-12-12  发布在  Ruby
关注(0)|答案(8)|浏览(95)

由于使用Hpricot的繁琐原因,我需要编写一个函数,该函数传递一个URL,并将页面的全部内容作为单个字符串返回。
我知道我需要使用OpenURI,它应该看起来像这样:

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

有人能建议我需要补充什么吗?

xesrikrc

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'))
vcudknz3

vcudknz32#

open方法在块产生时将资源的IO表示传递给块。

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

xjreopfe3#

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

另请参见IO class的文档

wn9m85ua

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)

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

jljoyd4f

jljoyd4f5#

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

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

o0lyfsai6#

从Ruby 3.0开始,通过Kernel#open调用URI.open的操作已经被删除,因此改为直接调用URI.open

require 'open-uri'
page_string = URI.open(url, &:read)
0lvr5msh

0lvr5msh7#

请尝试以下方法:

require 'open-uri' 
content = URI(your_url).read
hwazgwia

hwazgwia8#

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

相关问题