未定义的方法'children'的nil:NilClass(NoMethodError)

时间:2019-03-10 17:27:08

标签: nokogiri

我正在尝试借助nokogiri解析站点的简单示例,并针对nil:NilClass(NoMethodError)出现错误的未定义方法'children'

    require 'open-uri'

url = 'http://www.cubecinema.com/programme'
html = open(url)
puts html

require 'nokogiri'

doc = Nokogiri::HTML(html)
showings = doc.css('.showing').map do |showing|
  showing_id = showing['id'].split('_').last.to_i

  tags = showing.css('.tags a')
             .map{|tag| tag.text.strip}

  title_el = showing.at_css('h1 a')
                 .children
                 .delete_if{|c| c.name == 'span'}

  title = title_el.text.strip

  dates = showing.at_css('.start_and_pricing')
              .inner_html
              .strip
              .split('<br>')
              .map(&:strip)
              .map{|d| DateTime.parse(d)}

  description = showing.at_css('.copy')
                    .text
                    .delete('[more...]')
                    .strip

  {id:          showing_id,
   title:       title,
   tags:        tags,
   dates:       dates,
   description: description}
end

我找到了可能的解决方案https://translate.googleusercontent.com/translate_c?anno=2&depth=1&rurl=translate.google.com&sl=auto&sp=nmt4&tl=ru&u=https://github.com/dwightjack/grunt-email-boilerplate/issues/12&xid=25657,15700023,15700186,15700191,15700248,15700253&usg=ALkJrhgLkK2xqf-6SfL3K16DBRdtdNH0Cw,但不清楚预邮子任务是什么,阅读站点并不能真正帮助他们,我需要在哪里写下这些子任务。我将不胜感激,无论是由于自己的错误还是确定这些子任务的方式,我本人都不理解,并且缺乏经验。

2 个答案:

答案 0 :(得分:0)

由于缺乏声誉,我不能只留下评论,所以我只能在答案部分提供建议。

因此,我认为您应该首先检查show.at_css('h1 a')实例,以确保它具有子方法。某些Nokogiri对象没有任何子代(例如meta标签)。希望对您有所帮助。

答案 1 :(得分:0)

我在本地运行了程序,但是在要抓取的代码部分中找不到任何标签。

收到此错误的原因是因为Nokogiri返回nil元素,并且您试图删除已经没有任何值的内容,因此出现NilClass错误。

这是您试图从中检索“ h1 a”的代码部分。

<div class="showing" id="event_10427"> <div class="event_image"> <a href="/programme/event/vula-viel-do-not-be-afraid-album-tour,10427/"> 
    <img src="/media/diary/thumbnails/MSJ_vvlive.jpg.600x0_q45.jpg" alt="Picture for event Vula Viel - “Do Not Be Afraid” Album Tour"></a> <span class="tags"> <a href="/programme/view/music/" class="tag_music">music</a> </span> </div> <!-- div event_image --> <a href="/programme/event/vula-viel-do-not-be-afraid-album-tour,10427/"> 
<p><span class="pre_title"> Ear Trumpet Music presents </span></p> <h3>Vula Viel - “Do Not Be Afraid” Album Tour</h3> <span class="post_title"> </span> </a> <p></p> 
<div class="event_details"> <p class="start_and_pricing"> Thu 28 March // 20:00 <br> </p> <p class="copy">The trio of music makers called Vula Viel weave sparse polyrhythms and intricate rhythm structures around ... [<a class="more" href="/programme/event/vula-viel-do-not-be-afraid-album-tour,10427/">more</a>]</p> </div> </div>

您可以看到没有h1标签,因此Nokogiri在您的搜索中返回nil。

如果代表您的错误,则可以更改标签;或者如果不是每个页面都有一个“ h1 a”标签。您将需要检查

title_el = showing.at_css('h3 a')

在尝试删除它之前返回nil。