2012-10-04 19 views
5

私はRubyで単純なウェブスクレイピングをコーディングしようとしています。ルビー - ウェブスクレイピング - (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>' 

マイコード: それは29日、URLまで働き、その後、私は、このエラーメッセージが表示されます

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 

あなたはそれを解決するためにいくつかのアイデアを持っていますか? ありがとう!あなたは、リモートサーバー上の問題を解決できない場合

答えて

3

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

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ループの代わりに反復する
  • +0

    ありがとう私はルビーの初心者です... – jackkkk

    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 
    
    4

    コードはマイナーな誤植があります。それはag = ag + 1でなく、agenzie = ag + 1でなければなりません。私はコードがtypoで動作していなかったので、あなたがコードをstackoverflowにコピーしている間に起こったと仮定します。

    コードをローカルで実行でき、同じエラーが発生しました。 サイトでurl being accessed(codAgenzia = 30の場合)が利用できないことが判明しました。それは500

    だから問題はあなたのコードではなく、HTTPエラーを返しますが、slivuは彼の答えで述べたように、リモートサーバー(http://www.infotrav.it

    で、あなたはエラーを救出し、こする継続すべきです。ここで

    +0

    Prakash、今私は理解している.. p://www.infotrav.it/dettaglio.do?sort =%2aRICOVIAGGI%2a&codAgenzia = 30何らかのエラーを取得します! ありがとう! – jackkkk

    +0

    あなたは大歓迎です!回答を受け入れたものとしてマークすることを忘れないでください。 –