Как избежать перебора по значению Nil - PullRequest
1 голос
/ 12 июня 2019

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

Я пытался использовать это, но это не сработало:

name = li.css("strong a").text.strip unless li.nil?
url = li.css("a")[0].attr("href") unless li.nil?
Player.new(name,url)

class HomepageScraper
  BASE_URL = "https://www.nba.com/history/nba-at-50/top-50-players"

  def self.scrape_players
    page = open(BASE_URL)
    parsed_HTML = Nokogiri::HTML(page)
    name_lis = parsed_HTML.css("div.field-item li")
    name_lis.each do |li|
      name = li.css("strong a").text.strip
      url = li.css("a")[0].attr("href") 
      Player.new(name,url)
    end
  end
end

Я ожидал, что пример вывода будет:

@name = "Shaquille o neal", @url = "www.nba..."

Но получил:

@name = "Shaquille o neal", @url = nil

Сообщение об ошибке:

undefined method `attr' for nil:NilClass (NoMethodError)

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Если вы используете хотя бы Ruby 2.3, выполните команду

url = li.css("a")[0]&.attr("href")

. Устанавливает url на ноль, если часть слева от &. равна нулю, и применяет attr в противном случае.

0 голосов
/ 12 июня 2019

Вам следует использовать метод compact в массиве.

Это полезный метод, если вам нужно удалить значения nil из массива.

Например:

[1, nil, 2, nil].compact => [1, 2]

В вашем случае:

name_lis.compact.each do |li|
end
...