Ответ 1
Метод open
передает IO
представление ресурса вашему блоку, когда он дает. Вы можете прочитать его с помощью метода IO#read
open([mode [, perm]] [, options]) [{|io| ... }]
open(path) { |io| data = io.read }
Для утомительных причин, связанных с Hpricot, мне нужно написать функцию, которой передан URL-адрес, и возвращает все содержимое страницы как одну строку.
Я рядом. Я знаю, что мне нужно использовать OpenURI, и он должен выглядеть примерно так:
require 'open-uri'
open(url) {
# do something mysterious here to get page_string
}
puts page_string
Может кто-нибудь предложить, что мне нужно добавить?
Метод open
передает IO
представление ресурса вашему блоку, когда он дает. Вы можете прочитать его с помощью метода 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'
open(url) {|f| #url must specify the protocol
str = f.read()
}
Попробуйте вместо этого:
require 'open-uri'
content = URI(your_url).read