rubynokogiriruby-2.4

undefined method each for nil class in nokigiri use


i am trying to fetch all links on the given link but it is giving me an error undefined method `each' for nil:NilClass

require 'nokogiri'
def find_links(link)
page = Nokogiri::HTML(open(link))
link_size = page.css('li')
(0..link_size.length).each do |index|
    b = link_size[index]['href']
    return b
end
end
find_links('http://code.tutsplus.com/tutorials/you-dont-know-anything-about-regular-expressions-a-complete-guide--net-7869').each do |url|
puts url
end

Solution

  • There are couple of issues in your code. Find explanation inline below:

    def find_links(link)
      page = Nokogiri::HTML(open(link))
      link_size = page.css('li') 
      (0..link_size.length).each do |index|
         b = link_size[index]['href'] # You are expecting to get 'href' on list item which is wrong.
         return b # You shouldn't return from this block if you are expecting to get all the links. return from here will return from this method itself after first iteration. 
         # That's why you are getting nil error since link_size[index]['href'] doesn't have href attribute in first list item
      end
    end
    

    Change your code to: (find explanations inline)

    require 'nokogiri'
    require 'open-uri'
    def find_links(link)
      page = Nokogiri::HTML(open(link))
      # You want to iterate on anchor tags rather than list. 
      # See the use of `map`, it will return the array and since this is the last statement it will return from the method, giving all the links.
      # .css('li a') will give all the anchor tags which have list item in it's parent chain.
      page.css('li a').map { |x| x['href'] } 
    end
    find_links('http://code.tutsplus.com/tutorials/you-dont-know-anything-about-regular-expressions-a-complete-guide--net-7869').each do |url|
      puts url
    end