2009-12-06 12 views
10

Voglio ottenere il contenuto da questa * pagina. Tutto ciò che ho cercato dà la soluzione dell'analisi degli elementi CSS; ma quella pagina non ne ha.Come ottenere contenuto di pagine Web con Ruby - Sto avendo problemi

Ecco l'unico codice che ho trovato che sembrava dovrebbe funzionare:

file = File.open('http://hiscore.runescape.com/index_lite.ws?player=zezima', "r") 
contents = file.read 
puts contents 

Errore:

tracker.rb:1:in 'initialize': Invalid argument - http://hiscore.runescape.com/index_lite.ws?player=zezima (Errno::EINVAL) 
    from tracker.rb:1:in 'open' 
    from tracker.rb:1 

* http://hiscore.runescape.com/index_lite.ws?player=zezima

Se si tenta di formattare questo come un collegamento in il post non riconosce il carattere di sottolineatura (_) nell'URL per qualche motivo.

risposta

36

Sei sicuro di voler usare open() fornito dalla classe Kernel che può leggere da URI è sufficiente richiedere la libreria OpenURI prima:

require 'open-uri' 

Utilizzato in questo modo:

require 'open-uri' 
file = open('http://hiscore.runescape.com/index_lite.ws?player=zezima') 
contents = file.read 
puts contents 

Questo thread SO relativo copre t egli stessa domanda:

Open an IO stream from a local file or url

+0

Vedo - non lo sapevo. Tuttavia, a seconda di cosa vorrebbe fare con quel contenuto, potrebbe stare meglio con net/http. – halfdan

+0

Oo, è ancora meglio. Grazie. – Andrew

+0

@halfdan: totalmente d'accordo sul fatto che net/http sia migliore in generale. Non mi affido a questo metodo per qualcosa di non banale/di produzione. net/http ha i suoi difetti e io generalmente preferisco i collegamenti curl (lib curb). Questo post ha buone informazioni sulle prestazioni del client http - http://bit.ly/lvriR è fantastico perché hai un controllo più dettagliato sui timeout, che è estremamente critico nell'utilizzo di volumi elevati di produzione. –

6

Il modo più appropriato per recuperare il contenuto di un sito web è attraverso il Net :: HTTP modulo in Ruby:

require 'uri' 
require 'net/http' 
url = "http://hiscore.runescape.com/index_lite.ws?player=zezima" 
r = Net::HTTP.get_response(URI.parse(url).host, URI.parse(url).path) 

File.open() non supporta gli URI.

migliori auguri,
Fabian

+0

Gawr, StackOverflow persone sono le più cool. Grazie! – Andrew

+0

non è questa la risposta giusta allora? –

6

Si prega di utilizzare Open-uri, il suo sostegno sia uri e file locali

require 'open-uri' 
contents = open('http://www.google.com') {|f| f.read } 
Problemi correlati