5

ruby で簡単な Web スクレイピングをコーディングしようとしています。29 番目の URL まで機能すると、次のエラー メッセージが表示されます。

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>'

私のコード:

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

それを解決するためのアイデアはありますか?ありがとう!

なので

4

3 に答える 3

4

コードにマイナーなタイプミスがあります。あるべきでありag = ag + 1、そうではありませんagenzie = ag + 1。コードがタイプミスで機能しなかったため、コードをstackoverflowにコピーしているときに発生したと思います。

コードをローカルで実行できましたが、同じエラーが発生しました。アクセスされているURL(codAgenzia = 30の場合)がhttp://www.infotrav.itサイトで利用できないことが判明しました。HTTPエラー500を返します。

したがって、問題はコードではなく、リモートサーバー(http://www.infotrav.it)にあります。

slivuが彼の答えで述べたように、エラーを救出し、スクレイピングを続ける必要があります。

于 2012-10-04T23:27:58.273 に答える
4

ここで、あなたのためにそれをきれいにしましょう:

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

ノート:

  • ブロック スタイル File.open を使用すると、ブロックが終了したときにファイルが自動的に閉じます。
  • for ループの代わりに each を使用して繰り返します
于 2012-10-05T07:50:29.657 に答える
3

リモートサーバーで問題を修正できない場合は、エラーから回復して廃棄を続行してください。

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
于 2012-10-04T21:28:26.227 に答える