Как получить текст после или перед некоторыми тегами, используя Nokogiri

У меня есть HTML-документ, примерно такой:

<root><template>title</template>
<h level="3" i="3">Something</h>
<template element="1"><title>test</title></template>
# one
# two
# three
# four
<h level="4" i="5">something1</h>
some random test
<template element="1"><title>test</title></template>
# first
# second
# third
# fourth
<template element="2"><title>testing</title></template>
</root>

Я хочу извлечь:

# one
# two 
# three
# four
# first
# second
# third
# fourth

Другими словами, я хочу "весь текст после <template element="1"> <title>test</title> </template> и перед следующим тегом, который начинается после этого".

Я могу получить весь текст между root, используя '//root/text()', но как мне получить весь текст до и после определенных тегов?

2 ответа

Это работает:

require 'nokogiri'
xml = '<root>
 <template>title</template>
 <h level="3" i="3">Something</h>
 <template element="1">
 <title>test</title>
 </template>
 # one
 # two
 # three
 # four
 <h level="4" i="5">something1</h>
 some random test
 <template element="1">
 <title>test</title>
 </template>
 # first
 # second
 # third
 # fourth
 <template element="2">
 <title>testing</title>
 </template>
</root>
'
doc = Nokogiri::XML(xml)
text = (doc / 'template[@element="1"]').map{ |n| n.next_sibling.text.strip.gsub(/\n +/, "\n") }
puts text
# >> # one
# >> # two
# >> # three
# >> # four
# >> # first
# >> # second
# >> # third
# >> # fourth


Я уверен, что krusty.ar прав, что для этого не существует встроенного метода. Вы можете просто удалить все теги внутри корневого тега один за другим, если хотите. Это взлом, но он работает:

doc = Nokogiri::HTML(open(url)) # or Nokogiri::HTML.parse(File.open(file_path))
doc.xpath('//template').remove
doc.xpath('//h').remove
doc

Это дает результат, который вы ищете, с опубликованным HTML.

licensed under cc by-sa 3.0 with attribution.