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

时间:2017-03-29 22:14:18

标签: 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">
        <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。

1 个答案:

答案 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