неопределенный метод `children 'для nil: NilClass (NoMethodError) - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь восстановить простой пример синтаксического анализа сайта с помощью nokogiri и сообщаю об ошибке неопределенный метод `children 'для nil: NilClass (NoMethodError)

    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, но неясно, что представляют собой подзадачи premailer, чтение сайта не очень им помогло, где мне нужно записать эти подзадачи. Я буду очень благодарен за разъяснения либо по моей ошибке, либо по тому, как эти подзадачи должны быть определены, я сам не понимаю и не имею опыта, это возможно.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Я запускал вашу программу локально, и я не могу найти никаких тегов в разделе кода, который вы очищаете.

Причина, по которой вы получаете эту ошибку, заключается в том, что Nokogiri возвращает нулевой элемент, и выпопытка удалить что-то, что уже не имеет значения, поэтому вы получаете ошибку 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 возвращает ноль в вашем поиске.

Вы можете изменить тег, если это ошибка от вашего имени;или если не каждая страница имеет тег «h1 a».Вам нужно проверить, возвращает ли

title_el = showing.at_css('h3 a')

ноль, прежде чем пытаться удалить его.

0 голосов
/ 15 марта 2019

Я не могу оставить только комментарий из-за отсутствия репутации, поэтому могу давать советы только в разделе ответов.

Итак, я думаю, что вы должны сначала проверить экземпляр instance.at_css ('h1 a'), чтобы убедиться, что у него есть метод children. Некоторые объекты Nokogiri не имеют детей (например, метатег). Надеюсь, это поможет.

...