Удаление <p>элементов без текста с помощью Nokogiri - PullRequest
3 голосов
/ 25 августа 2011

Учитывая HTML-документ в Nokogiri, я хочу удалить все <p> узлы без реального текста. Это включает в себя <p> элементы с пробелами и / или <br/> теги. Какой самый элегантный способ сделать это?

Ответы [ 3 ]

7 голосов
/ 22 мая 2013

Это более простое исправление: оно удаляет пробелы и теги 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> 
4 голосов
/ 25 августа 2011

Я бы начал с метода, подобного этому (не стесняйтесь 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
0 голосов
/ 28 октября 2016

Есть более элегантный способ:

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
...