前提・実現したいこと
(ruby on rails)Nokogiriで指定した要素とそれ以下の階層を全て削除したいです。
孫もひ孫も全て削除したいです。
例
例えば#sample00
の子孫を持つtop
クラス全体を削除したいです。
①
html
1<div class="top">xxxxx</div> 2<div class="top"> 3 <h2 class="title">タイトル</h2> 4 <div class="inner"> 5 <p> 6 <span> 7 <a href="#sample1">リンク</a><br> 8 <a href="#sample2">リンク</a><br> 9 <a href="#sample3">リンク</a><br> 10 <a href="#sample4">リンク</a><br> 11 <a href="#sample5">リンク</a><br> 12 <a href="#sample6">リンク</a><br> 13 <a href="#sample7">リンク</a><br> 14 <a href="#sample8">リンク</a> 15 </span> 16 </p> 17 </div> 18</div> 19<div class="top">xxxxx</div> 20....
削除後↓
xml
1<div class="top">xxxxx</div> 2<div class="top">xxxxx</div>
やったことに際しての注意条件
span
タグはあったりなかったりして、階層数が読めないので、
何個目の親など数字で指定せず、#smple
を持つ要素の祖先を探しています。
Nokogiri : やったこと と バグ
top
をremoveしました。
rb
1html = Nokogiri::HTML.parse(省略) 2html.xpath('//div[@class="top"]').each do |node| 3 node.xpath('//a[contains(@href, "#sample")]/ancestor::*[contains(@class, "top")]').each do |remove_el| 4 remove_el.remove 5 end 6end 7
出力結果は①と変わりませんでした。
試しに、top
クラスをp
タグに変更したところ下記のようにp
タグが移動してしまったので
rb
1html = Nokogiri::HTML.parse(省略) 2html.xpath('//div[@class="top"]').each do |node| 3 node.xpath('//a[contains(@href, "#sample")]/ancestor::*[contains(@class, "top")]').each do |remove_el| 4 remove_el.name = "p" 5 end 6end 7
node.xpath('//a[contains(@href, "#sample")]/ancestor::*[contains(@class, "top")]').each do |remove_el|
ここではその要素自体しか取得できていないのだと思いました。
xml
1<div class="top">xxxxx</div> 2<p class="top"></p> 3<h2 class="title">タイトル</h2> 4<div class="inner"> 5 <p> 6 <span> 7 <a href="#sample1">リンク</a><br> 8 <a href="#sample2">リンク</a><br> 9 <a href="#sample3">リンク</a><br> 10 <a href="#sample4">リンク</a><br> 11 <a href="#sample5">リンク</a><br> 12 <a href="#sample6">リンク</a><br> 13 <a href="#sample7">リンク</a><br> 14 <a href="#sample8">リンク</a> 15 </span> 16 </p> 17</div> 18<div class="top">xxxxx</div>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/22 13:25