如何删除 HTML 节点之间的空白?

dav*_*son 6 ruby ruby-on-rails nokogiri ruby-on-rails-3

我正在尝试从<p>标签之间的 HTML 片段中删除空格

<p>Foo Bar</p> <p>bar bar bar</p> <p>bla</p>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,标签之间总是有一个空格<p> </p>

<br>问题是,将字符串保存到我的数据库时,空格会创建标签。strip诸如or 之类的方法gsub仅删除节点中的空白,从而导致:

<p>FooBar</p> <p>barbarbar</p> <p>bla</p>
Run Code Online (Sandbox Code Playgroud)

而我想要的是:

<p>Foo Bar</p><p>bar bar bar</p><p>bla</p>
Run Code Online (Sandbox Code Playgroud)

我在用着:

  • 野科切 1.5.6
  • 红宝石 1.9.3
  • 导轨

更新:

有时,标签的子节点会<p>产生相同的问题:之间有空格

示例代码

注意:代码通常在一行中,我重新格式化了它,因为否则它会难以忍受......

<p>
  <p>
    <strong>Selling an Appartment</strong>
  </p>
  <ul>
    <li>
      <p>beautiful apartment!</p>
    </li>
    <li>
      <p>near the train station</p>
    </li>
    .
    .
    .
  </ul>
  <ul>
    <li> 
      <p>10 minutes away from a shopping mall </p>
    </li>
    <li>
      <p>nice view</p>
    </li>
  </ul>
  .
  .
  .
</p>
Run Code Online (Sandbox Code Playgroud)

我该如何去除这些空白呢?

解决方案

事实证明,我使用方法搞砸了,没有进一步研究使用withgsub的可能性......gsubregex

简单的解决方案是添加

data = data.gsub(/>\s+</, "><")
Run Code Online (Sandbox Code Playgroud)

它删除了所有不同类型节点之间的空白...正则表达式!

the*_*Man 2

这就是我编写代码的方式:

require 'nokogiri'

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT)
<p>Foo Bar</p> <p>bar bar bar</p> <p>bla</p>
EOT

doc.search('p, ul, li').each { |node| 
  next_node = node.next_sibling
  next_node.remove if next_node && next_node.text.strip == ''
}

puts doc.to_html
Run Code Online (Sandbox Code Playgroud)

其结果是:

<p>Foo Bar</p><p>bar bar bar</p><p>bla</p>
Run Code Online (Sandbox Code Playgroud)

分解一下:

doc.search('p')
Run Code Online (Sandbox Code Playgroud)

仅查找<p>文档中的节点。Nokogiri 从 中返回一个 NodeSet search,如果没有匹配则返回 nil。该代码在 NodeSet 上循环,依次查看每个节点。

next_node = node.next_sibling
Run Code Online (Sandbox Code Playgroud)

获取指向当前节点之后的下一个节点的指针<p>

next_node.remove if next_node && next_node.text.strip == ''
Run Code Online (Sandbox Code Playgroud)

next_node.removenext_node如果下一个节点不为零并且其文本在剥离时不为空,换句话说,如果该节点只有空格,则从 DOM 中删除当前节点。

如果应从文档中删除所有 TextNode,则还有其他技术可以仅定位 TextNode。这是有风险的,因为它最终可能会删除标签之间的所有空白,从而导致连续的句子和连接的单词,这可能不是您想要的。