使用Nokogiri删除没有文本的<p>元素

dan*_*dan 3 ruby nokogiri

鉴于Nokogiri中的HTML文档,我想删除<p>没有实际文本的所有节点.这包括<p>带有空格和/或<br/>标记的元素.最优雅的方式是什么?

dav*_*son 7

这是一个更简单的修复:它删除了空格和br标记.

鉴于HTML

"<p>  </p><p>Foo<p/><p><br/> <br>   </p>"
Run Code Online (Sandbox Code Playgroud)

解:

document.css('p').find_all.each do |p|
    # Ruby on Rails Solution:
    p.remove if p.content.blank?

    # Ruby solution, as pointed out by Michael Hartl:
    p.remove if p.content.strip.empty?
end
# document => <p>Foo</p> 
Run Code Online (Sandbox Code Playgroud)

  • 注意 - 如果你的<p>只有非文本节点(img,video,audio等),那么`p.content`将返回一个空字符串. (2认同)

Ser*_*abe 5

我会从这样的方法开始(Nokogiri::XML::Node如果你愿意,请随意使用monkeypatch )

def is_blank?(node)
  (node.text? && node.content.strip == '') || (node.element? && node.name == 'br')
end
Run Code Online (Sandbox Code Playgroud)

然后继续使用另一种检查所有子项是否为空的方法:

def all_children_are_blank?(node)
  node.children.all?{|child| is_blank?(child) } 
  # Here you see the convenience of monkeypatching... sometimes.
end
Run Code Online (Sandbox Code Playgroud)

最后,得到document

document.css('p').find_all{|p| all_children_are_blank?(p) }.each do |p|
  p.remove
end
Run Code Online (Sandbox Code Playgroud)