Nokogiri:用<p>标签</p>包装顶级文本元素

时间:2013-06-03 14:28:57

标签: ruby xpath nokogiri

无法为另一个标记尚未包含的“裸”文本节点构建XPath选择器。我想改变这个:

some naked text <p>some wrapped text</p> more naked text

进入这个:

<p>some naked text</p> <p>some wrapped text</p> <p>more naked text</p>

我尝试使用doc.xpath("//child::text()").wrap('<p></p>'),但这似乎抓住了所有文本节点,而不仅仅是顶级节点。

2 个答案:

答案 0 :(得分:3)

doc.xpath('/html/body/text()').wrap('<p/>')

当您使用//时,您选择了descendant-or-self轴,即文档中的任意位置。相反,您希望使用/和(默认的child轴)来仅匹配作为特定元素的直接子节点的文本节点。

如果这不是包含<html><body>元素的HTML文档,那么只需:

doc.xpath('/*/text()').wrap('<p/>')

将选择所有文本元素作为根XML元素的子元素(无论其名称如何)。

答案 1 :(得分:0)

您可以找到除段落内的所有文字。

'//text()[not(ancestor::p)]'