我有一个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>
我想提取:
# one
# two
# three
# four
# first
# second
# third
# fourth
</root>
换句话说,我希望“<template element="1"><title>test</title></template>
之后的所有文字以及之后开始的下一个标记之前。”
我可以使用'//root/text()'
获取root之间的所有文本,但如何在某些标记之前和之后获取所有文本?
答案 0 :(得分:5)
这似乎有效:
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
答案 1 :(得分:0)
我很确定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提供您正在寻找的结果。