鉴于Nokogiri中的HTML文档,我想删除所有没有实际文本的<p>
节点。这包括带有空格和/或<p>
标记的<br/>
元素。最优雅的方法是什么?
答案 0 :(得分:7)
这是一个更简单的修复:它删除了空格和br
标记。
给出HTML
"<p> </p><p>Foo<p/><p><br/> <br> </p>"
<强>解决方案:强>
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>
答案 1 :(得分:4)
我会从像这样的方法开始(如果你愿意,可以随意使用monkeypatch Nokogiri::XML::Node
)
def is_blank?(node)
(node.text? && node.content.strip == '') || (node.element? && node.name == 'br')
end
然后继续使用另一种检查所有孩子都是空白的方法:
def all_children_are_blank?(node)
node.children.all?{|child| is_blank?(child) }
# Here you see the convenience of monkeypatching... sometimes.
end
最后,获取document
和
document.css('p').find_all{|p| all_children_are_blank?(p) }.each do |p|
p.remove
end
答案 2 :(得分:0)
有一种更优雅的方式:
require "nokogiri"
doc = Nokogiri::HTML.parse <<-EOHTML
<div>
<p class="empty_p"></p>
<p class="full_p">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
EOHTML
# Magic happens here...
doc.at_css("p:first-child:empty").remove
puts doc.to_html