Ответ 1
Чтобы получить все прямые дети с текстом, но не любые дополнительные дочерние элементы, вы можете использовать XPath следующим образом:
doc.xpath('//dt/text()')
Или если вы хотите использовать поиск:
doc.search('dt').xpath('text()')
У меня есть HTML, который выглядит так:
<dt>
<a href="#">Hello</a>
(2009)
</dt>
У меня уже весь мой HTML загружен в переменную под названием record
. Мне нужно разобрать год, то есть 2009 год, если он существует.
Как получить текст внутри тега dt
, но не текст внутри тега a
? Я использовал record.search("dt").inner_text
, и это дает мне все.
Это тривиальный вопрос, но мне это не удалось понять.
Чтобы получить все прямые дети с текстом, но не любые дополнительные дочерние элементы, вы можете использовать XPath следующим образом:
doc.xpath('//dt/text()')
Или если вы хотите использовать поиск:
doc.search('dt').xpath('text()')
Использование 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
Элемент dt
имеет двух дочерних элементов, поэтому вы можете получить к нему доступ:
doc.search("dt").children.last.text