Удалить внешние теги из элемента с Nokogiri? - PullRequest
4 голосов
/ 11 марта 2012

Вот что я хочу сделать:

Удалите узлы "span" с классом "none".

Удалите «лишние» узлы, но оставьте текст внутри них.

Удалите все узлы "br" и замените их узлами "p"

<p class="normal">
    <span class="none">
        <extra>Some text goes here</extra>
    </span>
    <span class="none">
        <br/>
    </span>
    <span class="none">
        <extra>Some other text goes here</extra>
        <br/>
    </span>
</p>

Это вывод, который я хотел бы получить:

<p class="normal">Some text goes here</p>
<p class="normal">Some other text goes here</p>

Я уже пробовал это:

doc.xpath('html/body/p/span').each do |span|
    span.attribute_nodes.each do |a|
       if a.value == "none"
          span.children.each do |child|
             span.parent << child
          end
          span.remove
       end
    end
end

Но это вывод, который я получаю, он даже не в правильном порядке:

<p class="normal"><br /><br />Some text goes hereSome other text goes here</p>

1 Ответ

8 голосов
/ 11 марта 2012

Попробуйте это

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML(DATA)
doc.css("span.none, extra").each do |span|
  span.swap(span.children)
end

# via /5727446/kak-obernut-html-teg-bez-teksta-tegom-p-s-pomoschy-nokogiri
doc.search("//br/preceding-sibling::text()|//br/following-sibling::text()").each do |node|
  if node.content !~ /\A\s*\Z/
    node.replace(doc.create_element('p', node))
  end
end

doc.css('br').remove

puts doc

__END__
<p class="normal">
    <span class="none">
        <extra>Some text goes here</extra>
    </span>
    <span class="none">
        <br/>
    </span>
    <span class="none">
        <extra>Some other text goes here</extra>
        <br/>
    </span>
</p>

Какие отпечатки

<?xml version="1.0"?>
<p class="normal">

        <p>Some text goes here</p>





        <p>Some other text goes here</p>


</p>
...