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

我正在尝试从

标记之间的HTML片段中删除空格

 

Foo Bar

bar bar bar

bla

如您所见,

标记之间总是有空格。

问题是在将字符串保存到我的数据库时,空格会创建
标记。 像stripgsub这样的方法只删除节点中的空格,导致:

 

FooBar

barbarbar

bla

而我想要:

 

Foo Bar

bar bar bar

bla

我正在使用:

  • Nokogiri 1.5.6
  • Ruby 1.9.3
  • 轨道

更新:

偶尔会有

标签的子节点产生同样的问题:之间有空格

示例代码

注意:代码通常在一行中,我重新格式化它,因为它是无法忍受的,否则……

 

Selling an Appartment

  • beautiful apartment!

  • near the train station

  • . . .
  • 10 minutes away from a shopping mall

  • nice view

. . .

我怎么剥去那些白色空间呢?

事实certificate,我搞砸了使用gsub方法,并没有进一步调查使用gsubregex的可能性…

简单的解决方案是添加

 data = data.gsub(/>\s+<") 

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

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

 require 'nokogiri' doc = Nokogiri::HTML::DocumentFragment.parse(<Foo Bar

bar bar bar

bla

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

它导致:

 

Foo Bar

bar bar bar

bla

打破它:

 doc.search('p') 

仅查找文档中的

节点。 Nokogiri从search返回NodeSet,如果没有匹配则返回nil。 代码循环遍历NodeSet,依次查看每个节点。

 next_node = node.next_sibling 

获取指向当前

节点之后的下一个节点的指针。

 next_node.remove if next_node && next_node.text.strip == '' 

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

如果所有文本节点都应从文档中剥离,则还有其他技术可以仅定位TextNodes。 这是有风险的,因为它最终会删除标签之间的所有空白,导致连续的句子和加入的单词,这可能不是你想要的。

第一个解决方案可以是删除空文本节点,为您的确切情况快速执行此操作可以是:

 require 'nokogiri' doc = Nokogiri::HTML("

Foo Bar

bar bar bar

bla

") doc.css('body').first.children.map{|node| node.to_s.strip}.compact.join

这对于嵌套元素不起作用,但应该为您提供良好的开始路径。

更新:

你可以实际优化一点:

 require 'nokogiri' doc = Nokogiri::HTML::DocumentFragment.parse("

Foo Bar

bar bar bar

bla

") doc.children.map{|node| node.to_s.strip}.compact.join

data.squish做同样的事情,并且更具可读性。