Ruby Nokogiri:将类应用于具有特定子代的元素

Ruby Nokogiri:将类应用于具有特定子代的元素,ruby,nokogiri,Ruby,Nokogiri,假设我有一个html,它有不同深度的子体和混合的元素类型: <div class="foo"> <div class="bar"></div> </div> <div class="foo"> <div class="baz"></div> </div> <div class="foo"> <u><span class="duh">

假设我有一个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类的FOO应用一个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,哎呀。

我花了很长时间想知道为什么没有找到第二个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
数据=%q(
)
需要“nokogiri”
doc=Nokogiri.HTML(数据)
doc.xpath(//div[@class='foo'和//div[@class='bar']])。每个do |节点|
节点[“类”]=“bex”
结束
放博士

谢谢你的工作!很抱歉没有关闭duh,duh。如果有人想解释如何通过css目标而不是xpath完成cld,我很想知道。