ruby - Recuperar contenidos de URL como cadena
open-uri (7)
El método open
pasa una representación de IO
del recurso a su bloque cuando cede. Puedes leer desde él usando el método de IO#read
open([mode [, perm]] [, options]) [{|io| ... }]
open(path) { |io| data = io.read }
Por razones tediosas de hacer con Hpricot, necesito escribir una función a la que se le pase una URL y que devuelva todo el contenido de la página como una sola cadena.
Estoy cerca. Sé que necesito usar OpenURI, y debería tener este aspecto:
require ''open-uri''
open(url) {
# do something mysterious here to get page_string
}
puts page_string
¿Alguien puede sugerir lo que necesito agregar?
Intente lo siguiente en su lugar:
require ''open-uri''
content = URI(your_url).read
Para que el código sea un poco más claro, el método open
OpenURI devolverá el valor devuelto por el bloque, por lo que puede asignar el valor de retorno de open
a su variable. Por ejemplo:
xml_text = open(url) { |io| io.read }
Puedes hacer lo mismo sin 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
O, más sucintamente:
Net::HTTP.get(URI.parse(''http://www.google.com''))
También estaba muy confundido sobre qué usar para obtener un mejor rendimiento y resultados rápidos. Me encontré con un punto de referencia para ambos para que sea más claro:
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
Su resultado es:
user system total real
net-http: 0.000000 0.000000 0.000000 ( 0.097779)
open-uri: 0.030000 0.010000 0.040000 ( 0.864526)
Me gustaría decir que depende de cuál sea su requerimiento y cómo desea procesarlo.
require ''open-uri''
open(url) {|f| #url must specify the protocol
str = f.read()
}
require ''open-uri''
open(url) do |f|
page_string = f.read
end
Véase también la documentación de la clase IO.