Очистка веб-сайта с отсутствующим URL / ruby

#ruby #web-scraping #export-to-csv #nokogiri

#рубиновый #соскабливание полотна #экспорт в csv #nokogiri

Вопрос:

Я очищаю веб-сайт, и некоторые URL-адреса отсутствуют. В результате мой код не может получить все данные, которые я пытаюсь сохранить.

Вот мой код :

 informations = []

0.upto(94) do |n|
  begin
    html_file = open(departement[n]).read
    html_doc = Nokogiri::HTML(html_file)
    unless n == 19
      html_doc.search('a').each do |element|
        if n < 9
          x = "http://www.annuaire-des-mairies.com/0#{n   1}/"   element.text.strip
          informations << x
        elsif n > 9 amp;amp; n < 19
          y = "http://www.annuaire-des-mairies.com/#{n   1}/"   element.text.strip
          informations << y
        elsif n > 19
          z=  "http://www.annuaire-des-mairies.com/#{n   2}/"   element.text.strip
          informations << z

          csv_options = { col_sep: ',', force_quotes: true, quote_char: '"' }
          filepath    = 'mairiesscrapées.csv'
          informations.each do |information|
            next unless information.include? ".html"
            html_file = open(URI.parse(URI.escape(information))).read
            html_doc = Nokogiri::HTML(html_file)
            g = html_doc.search("td")
            CSV.open(filepath, 'ab', csv_options) do |csv|
              csv << [g[0].to_s, g[3].to_s, g[7].to_s, g[13].to_s]
              puts csv
            rescue OpenURI::HTTPError => ex
               puts "Handle missing link here"
            end
          end
        end
      end
    end
  end
end
 

Я пытался вставить begin rescue метод, но моя консоль продолжает отвечать мне :

      1: from /Users/pierrelaburthe/.rbenv/versions/2.6.3/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
/Users/pierrelaburthe/.rbenv/versions/2.6.3/lib/ruby/2.6.0/open-uri.rb:378:in `open_http': 404 Not Found (OpenURI::HTTPError)
 

Комментарии:

1. Что, по-вашему, должна делать ваша программа после спасения исключения?

2. Ошибка 404 возникает из-за того, что извлеченный URL-адрес недействителен или потому, что страница фактически не существует?

3. Помимо других проблем, все, что делает rescue, — это дает программе возможность обработать исключение. Это зависит от программиста, скорее всего, с помощью повторной попытки или продолжения, в зависимости от того, что делает цикл.

4. URL-адрес не существует, и я ожидаю, что программа продолжит удаление других URL-адресов, даже если один URL-адрес поврежден.

Ответ №1:

Проблема может быть в том, что средство спасения находится не в нужном месте. Его нужно переместить на несколько уровней, чтобы перехватить исключение.

 informations = []

0.upto(94) do |n|
  begin
    html_file = open(departement[n]).read
    html_doc = Nokogiri::HTML(html_file)
    unless n == 19
      html_doc.search('a').each do |element|
        if n < 9
          x = "http://www.annuaire-des-mairies.com/0#{n   1}/"   element.text.strip
          informations << x
        elsif n > 9 amp;amp; n < 19
          y = "http://www.annuaire-des-mairies.com/#{n   1}/"   element.text.strip
          informations << y
        elsif n > 19
          z=  "http://www.annuaire-des-mairies.com/#{n   2}/"   element.text.strip
          informations << z

          csv_options = { col_sep: ',', force_quotes: true, quote_char: '"' }
          filepath    = 'mairiesscrapées.csv'
          informations.each do |information|
            next unless information.include? ".html"
            html_file = open(URI.parse(URI.escape(information))).read
            html_doc = Nokogiri::HTML(html_file)
            g = html_doc.search("td")
            CSV.open(filepath, 'ab', csv_options) do |csv|
              csv << [g[0].to_s, g[3].to_s, g[7].to_s, g[13].to_s]
              puts csv
            end
          end
        end
      end
    end
  rescue OpenURI::HTTPError => ex
    puts "Handle missing link here"
  end
end