web-dev-qa-db-fra.com

Récupérer le contenu de l'URL sous forme de chaîne

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?

24
AP257

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 }
21
Jeriko

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'))
57
Carlo Pecchia
require 'open-uri'
open(url) do |f|
  page_string = f.read
end

Voir aussi la documentation de classe IO

11
Teoulas

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.

5
Gagan Gami

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 }
2
Keith Bennett