Чтобы уточнить, если вы посмотрите на структуру исходного кода HTML, вы увидите, что самое первое вхождение <div class="brief">
не имеет дочернего тега h3
(на самом деле он имеет только дочерний тег <p>
).
Документы Нокогири говорят, что
at_css (* правила)
Поиск этого узла для первого появления правил CSS. Эквивалент css (rules) .first Для получения дополнительной информации см. Node # css.
Если вы позвоните по номеру at_css(*rules)
, в документе говорится, что это эквивалентно css(rules).first
. Когда есть элементы (ваш класс .brief
содержит h3
), тогда возвращается объект Nokogiri::XML::Element
, который отвечает на text
, тогда как если ваш .brief
не содержит h3
, тогда объект NilClass
возвращается, что, конечно, не отвечает на text
Поэтому, если мы вызываем css(rules)
(не at_css
, как у вас), мы получаем возвращенный объект Nokogiri::XML::NodeSet
, для которого метод text()
определен как (обратите внимание на alias
)
# Get the inner text of all contained Node objects
def inner_text
collect{|j| j.inner_text}.join('')
end
alias :text :inner_text
, поскольку класс Enumerable
, он перебирает своих детей, вызывающих их метод inner_text
, и объединяет их всех вместе.
Поэтому вы можете выполнить проверку nil?
или, если указано @floatless, просто используйте метод css