假设我有这个html,它有各种深度的后代和元素类型的混合:
<div class="foo">
<div class="bar"></div>
</div>
<div class="foo">
<div class="baz"></div>
</div>
<div class="foo">
<u><span class="duh">
<div class="bar"></div>
</span></u>
</div>
<div class="foo">
<div class="baz"></div>
</div>
我想对所有包含bar类的foos应用一类bex,看起来像:
<div class="bex">
<div class="bar"></div>
</div>
<div class="foo">
<div class="baz"></div>
</div>
<div class="bex">
<u><span class="duh">
<div class="bar"></div>
</span></u>
</div>
<div class="foo">
<div class="baz"></div>
</div>
我是如何用ruby / nokogiri做到的?尝试过各种各样的事情并且不能完全理解。感谢。
编辑:关闭duh,oops。
答案 0 :(得分:1)
我花了很长时间想知道为什么找不到第二个foo。
您的数据已损坏,"duh
尚未关闭。
要选择节点,您可以使用:
doc.xpath("//div[@class='foo' and .//div[@class='bar']]")
举个例子:
data = %q(<div class="foo">
<div class="bar"></div>
</div>
<div class="foo">
<div class="baz"></div>
</div>
<div class="foo">
<u><span class="duh">
<div class="bar"></div>
</span></u>
</div>
<div class="foo">
<div class="baz"></div>
</div>)
require 'nokogiri'
doc = Nokogiri.HTML(data)
doc.xpath("//div[@class='foo' and .//div[@class='bar']]").each do |node|
node["class"] = 'bex'
end
puts doc