2009-12-06 17 views
10

Ich möchte den Inhalt von dieser * Seite bekommen. Alles, was ich nachgeschlagen habe, bietet die Lösung zum Parsen von CSS-Elementen; aber diese Seite hat keine.Inhalt der Webseite mit Ruby erhalten - Ich habe Probleme

Hier ist der einzige Code, den ich gefunden, die sah aus wie es funktionieren sollte:

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

Fehler:

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

Wenn Sie versuchen, dies als einen Link zu formatieren in Der Post erkennt den Unterstrich (_) in der URL aus irgendeinem Grund nicht.

Antwort

36

Sie wirklich verwenden möchten open() durch die Kernel-Klasse, die kann von URIs lesen Sie müssen nur zuerst die openURI Bibliothek verlangen:

require 'open-uri' 

Verwendet wie folgt:

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

Dieser verwandte SO-Thread behandelt t er dieselbe Frage:

Open an IO stream from a local file or url

+0

Ich sehe - wusste das nicht. Dennoch, je nachdem, was er mit diesem Inhalt machen möchte, könnte er mit net/http besser dran sein. – halfdan

+0

Oo, das ist noch besser. Vielen Dank. – Andrew

+0

@halfdan - stimme völlig zu, dass net/http im Allgemeinen besser ist. Ich verlasse mich nicht auf diese Methode für irgendetwas nicht Triviales/Produktion. net/http hat seine Mängel und ich bevorzuge generell die Curl Bindings (lib curb). Dieser Beitrag hat gute Informationen über http Client-Leistung - http://bit.ly/lvriR Bordstein ist großartig, weil Sie viel feinkörniger Kontrolle über die Timeouts, die in Großserienproduktion super kritisch ist. –

6

Der geeignete Weg, um den Inhalt einer Website ist durch das NET :: HTTP-Modul in Ruby zu holen:

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() nicht unterstützt URIs.

Best wishes,
Fabian

+0

Gawr, Stackoverflow Menschen sind die coolsten. Vielen Dank! – Andrew

+0

ist das nicht die richtige Antwort dann? –

6

Bitte benutzen Sie open-uri, seine Unterstützung sowohl uri und lokale Dateien

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