Подтвердить что ты не робот

Получить текст непосредственно внутри тега в Нокигири

У меня есть HTML, который выглядит так:

<dt>
  <a href="#">Hello</a>
  (2009)
</dt>

У меня уже весь мой HTML загружен в переменную под названием record. Мне нужно разобрать год, то есть 2009 год, если он существует.

Как получить текст внутри тега dt, но не текст внутри тега a? Я использовал record.search("dt").inner_text, и это дает мне все.

Это тривиальный вопрос, но мне это не удалось понять.

4b9b3361

Ответ 1

Чтобы получить все прямые дети с текстом, но не любые дополнительные дочерние элементы, вы можете использовать XPath следующим образом:

doc.xpath('//dt/text()')

Или если вы хотите использовать поиск:

doc.search('dt').xpath('text()')

Ответ 2

Использование XPath для выбора именно того, что вы хотите (как предложено @Casper), является правильным ответом.

def own_text(node)
  # Find the content of all child text nodes and join them together
  node.xpath('text()').text
end

Вот альтернативный, забавный ответ:)

def own_text(node)
  node.clone(1).tap{ |copy| copy.element_children.remove }.text
end

В действии:

require 'nokogiri'
root = Nokogiri.XML('<r>hi <a>BOO</a> there</r>').root
puts root.text       #=> hi BOO there
puts own_text(root)  #=> hi  there

Ответ 3

Элемент dt имеет двух дочерних элементов, поэтому вы можете получить к нему доступ:

doc.search("dt").children.last.text