【问题标题】:Nokogiri: wrap top-level text elements with <p> tagsNokogiri:用 <p> 标签包装顶级文本元素
【发布时间】:2013-06-03 14:28:57
【问题描述】:

在为尚未包含在另一个标记中的“裸”文本节点构建 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('&lt;p&gt;&lt;/p&gt;'),但这似乎会抓取所有文本节点,而不仅仅是顶级节点。

【问题讨论】:

  • // 将选择:“从当前节点中选择文档中与选择匹配的节点,无论它们在哪里。”尝试"/*/text() 中的文本根元素。

标签: ruby xpath nokogiri


【解决方案1】:
doc.xpath('/html/body/text()').wrap('<p/>')

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

如果这不是带有 &lt;html&gt;&lt;body&gt; 元素的 HTML 文档,那么只需:

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

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

【讨论】:

  • /html/body 是我缺少的部分。我的文档是由没有任何 容器的 HTML 文本片段构建的,但 Nokogiri 出乎意料地为我创建了这些标签。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 这将包装&lt;h1&gt;foo&lt;/h1&gt;,例如,或&lt;ul&gt;&lt;li&gt;bar&lt;/li&gt;&lt;/ul&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2013-01-06
相关资源
最近更新 更多