2012-10-04 15 views
5

Ich versuche, ein einfaches Web Scraping in Ruby zu codieren. Es funktioniert bis 29. url dann habe ich diese Fehlermeldung:RUBY - Web Scraping - (OpenURI :: HTTPError)

C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:346:in `open_http': 500 Internal Server Er 
ror (OpenURI::HTTPError) 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:201:in `catch' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:677:in `open' 
     from C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:33:in `open' 
     from test.rb:24:in `block (2 levels) in <main>' 
     from test.rb:18:in `each' 
     from test.rb:18:in `block in <main>' 
     from test.rb:14:in `each' 
     from test.rb:14:in `<main>' 

Mein Code:

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

aFile=File.new('data.txt', 'w') 

ag = 0 
    for i in 1..40 do 
    agenzie = ag + 1 

    #change url parameter 

    url = "http://www.infotrav.it/dettaglio.do?sort=*RICOVIAGGI*&codAgenzia=" + "#{ ag }" 
    doc = Nokogiri::HTML(open(url)) 
    aFile=File.open('data.txt', 'a') 
    aFile.write(doc.at_css("table").text) 
    aFile.close 
    end 

Haben Sie ein paar Ideen, es zu lösen? Danke!

aS

Antwort

3

Hier, lassen Sie mich es für Sie aufzuräumen:

File.open('data.txt', 'w') do |aFile| 
    (1..40).each do |ag| 
    url = "http://www.infotrav.it/dettaglio.do?sort=*RICOVIAGGI*&codAgenzia=#{ag}" 
    response = open(url) rescue nil 
    next unless response 
    doc = Nokogiri::HTML(response) 
    aFile << doc.at_css("table").text 
    end 
end 

Hinweise:

  • mit Block Stil File.open bedeutet, dass die Datei selbst schließen, wenn der Block verlässt
  • Verwendung jeder zu iterieren statt für Schleife
+0

Danke Ich bin ein Neuling in Ruby ... – jackkkk

3

wenn Sie das Problem nicht auf Remote-Server beheben können, versuchen von Fehlern zu retten und weiter Verschrottung:

begin 
    doc = Nokogiri::HTML(open(url)) 
    aFile=File.open('data.txt', 'a') 
    aFile.write(doc.at_css("table").text) 
    aFile.close 
rescue => e 
    puts e.message 
end 
4

Der Code hat einen kleineren Tippfehler. Es sollte ag = ag + 1 und nicht agenzie = ag + 1 sein. Ich nehme an, dass passiert ist, während Sie den Code in Stackoverflow kopiert haben, da der Code mit dem Tippfehler nicht funktioniert hätte.

Ich konnte den Code lokal ausführen und bekam den gleichen Fehler. Stellt sich heraus, url being accessed (wenn codAgenzia = 30) ist nicht verfügbar auf der http://www.infotrav.it Website; es gibt einen HTTP-Fehler 500

Also das Problem nicht mit Ihrem Code ist, aber mit dem Remote-Server (http://www.infotrav.it)

Wie slivu in seiner Antwort erwähnt, sollten Sie die Fehler retten und Schaben fortzusetzen.

+0

Prakash, jetzt verstehe ich .. Problem ist, dass der Server auf htt p: //www.infotrav.it/dettaglio.do? sort =% 2aRICOVIAGGI% 2a & codAgenzia = 30 Fehler beheben! Danke! – jackkkk

+0

Gern geschehen! Vergessen Sie nicht, die Antwort als akzeptiert zu markieren. –