Pour des raisons fastidieuses liées à Hpricot, j'ai besoin d'écrire une fonction à laquelle est passée une URL et retourne tout le contenu de la page sous forme de chaîne unique.
Je suis proche. Je sais que je dois utiliser OpenURI, et cela devrait ressembler à ceci:
require 'open-uri'
open(url) {
# do something mysterious here to get page_string
}
puts page_string
Quelqu'un peut-il suggérer ce que je dois ajouter?
La méthode open
transmet une représentation IO
de la ressource à votre bloc lorsqu'il cède. Vous pouvez le lire en utilisant IO#read
méthode
open([mode [, perm]] [, options]) [{|io| ... }]
open(path) { |io| data = io.read }
Vous pouvez faire de même sans 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
Ou, plus succinctement:
Net::HTTP.get(URI.parse('http://www.google.com'))
require 'open-uri'
open(url) do |f|
page_string = f.read
end
Voir aussi la documentation de classe IO
J'étais également très confus quoi utiliser pour de meilleures performances et des résultats rapides. J'ai effectué un benchmark pour les deux pour le rendre plus clair:
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
Son résultat est:
user system total real
net-http: 0.000000 0.000000 0.000000 ( 0.097779)
open-uri: 0.030000 0.010000 0.040000 ( 0.864526)
Je voudrais dire que cela dépend de vos besoins et de la façon dont vous souhaitez traiter.
Pour rendre le code un peu plus clair, la méthode OpenURI open
renverra la valeur retournée par le bloc, vous pouvez donc affecter la valeur de retour de open
à votre variable. Par exemple:
xml_text = open(url) { |io| io.read }