Как я могу обработать ответ об ошибке rest-client 500 и продолжать просматривать мой l oop? - PullRequest
1 голос
/ 14 февраля 2020

Мне нужно почистить 10 тыс. URL-адресов с этого сайта, и некоторые из них не работают (я думаю ... это ошибка, которая не возвращает JSON, который я ищу, поэтому rest-client возвращает 500 Internal Server error в моей программе)

Синтаксис ошибки: `exception_with_response ': 500 Внутренняя ошибка сервера (RestClient :: InternalServerError)

До l oop через URL-адреса, я Использую range (1..30).each do |id|. Я объединяю URL с текущей итерацией этого диапазона.

response = RestClient.get(url+id)

Проблема в том, что иногда URL, который я храню в переменной ответа, не существует, и / или веб-страница возвращает какую-то ошибку. Как я могу защитить свой код, чтобы я мог просто пропустить этот проблемный URL c и сохранить его?

Вот мой текущий код (я помещаю каждый код l oop в блок begin / rescue , но я не знаю, как написать код, чтобы сделать такую ​​вещь):

require 'nokogiri'
require 'csv'
require 'rest-client'
require 'json'

link = "https://webfec.org.br/Utils/GetCentrobyId?cod="
CSV.open('data2.csv', 'ab') do |csv|
    csv << ['Name', 'Street', 'Info', 'E-mail', 'Site']
    (1..30).each do |id|
        begin
            response = RestClient.get(link+id.to_s)
            json = JSON.parse(response)
            html = json["Data"]
            doc = Nokogiri::HTML.parse(html)

            name = doc.xpath("/html/body/table/tbody/tr[1]").text
            street = doc.xpath("/html/body/table/tbody/tr[2]").text.gsub(Regexp.union(REMOVER), " ")
            info = doc.xpath("/html/body/table/tbody/tr[3]").text.gsub(Regexp.union(REMOVER), " ")
            email = doc.xpath("/html/body/table/tbody/tr[4]").text.gsub(Regexp.union(REMOVER), " ")
            site = doc.xpath("/html/body/table/tbody/tr[5]").text.gsub(Regexp.union(REMOVER), " ")

            csv << [name, street, info, email, site]
        rescue

        end
    end
end

Вы можете видеть, что я поместил все в l oop внутри блока begin и есть rescue Блок в конце, но я немного растерялся, как поступить с такой вещью.

1 Ответ

1 голос
/ 15 февраля 2020

Вы должны просто спасти исключение для exmaple:

[*1..3].each{|i| RestClient.get('https://fooboton.free.beeceptor.com') rescue RestClient::InternalServerError; next}

Так что для вашего случая выполните:

CSV.open('data2.csv', 'ab') do |csv|
    csv << ['Name', 'Street', 'Info', 'E-mail', 'Site']
    (1..30).each do |id|
      begin
        response = RestClient.get(link+id.to_s) 
      rescue RestClient::InternalServerError
        next # skip this iteration in your loop
      end
    ... # rest of your code
...