ruby open-uri

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.