如何避免对Nil值进行迭代

时间:2019-06-12 04:48:40

标签: ruby nokogiri

我正在尝试抓取网站的内容以从数据中实例化对象,但是我在抓取的页面上出现了无效链接的问题。我想弄清楚如何无法简单地遍历该链接并避免完全刮擦它。

我尝试使用它,但是没有用:

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 :(得分:0)

您应该在Array上使用compact方法。

如果您需要从数组中删除nil值,这是一种有用的方法。

例如:

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

在您的情况下:

name_lis.compact.each do |li|
end

答案 1 :(得分:0)

如果您至少运行Ruby 2.3,请执行

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

如果&.左侧的部分为nil,则将url设置为nil,否则应用attr