2017-03-30 68 views
-1

使用ruby/nokogiri我想包裝一些元素,從一個元素開始,到下一個元素之前結束。因此,可以說,我有:包裝一系列兄弟元素

<div class="foo"></div> 
<div class="bar"></div> 
<div class="bar"></div> 
<div class="foo"></div> 
<div class="bar"></div> 
<div class="bar"></div> 
<div class="bar"></div> 
<div class="bar"></div> 
<div class="foo"></div> 
<div class="foo"></div> 
<div class="bar"></div> 
<div class="bar"></div> 

我想包裝所有的Foo及其鄰近的酒吧(如果有的話),在接下來的FOO(最後一個obvs沒有其他富之前關閉一類巴茲),如下所示:

<div class="baz"> 
    <div class="foo"></div> 
    <div class="bar"></div> 
    <div class="bar"></div> 
</div> 
<div class="baz"> 
    <div class="foo"></div> 
    <div class="bar"></div> 
    <div class="bar"></div> 
    <div class="bar"></div> 
    <div class="bar"></div> 
</div> 
<div class="baz"> 
    <div class="foo"></div> 
</div> 
<div class="baz"> 
    <div class="foo"></div> 
    <div class="bar"></div> 
    <div class="bar"></div> 
</div> 

謝謝。

編輯:我發現這一點,問過類似的問題,但我努力適應它XPath axis, get all following nodes until

編輯2:這將foo的後返回酒吧,但不是富:

body.xpath("(//div[@class='foo'])[1]/following-sibling::div[@class='bar'] 
    [1 = count(preceding-sibling::div[@class='foo'][1] | (//div[@class='foo'])[1])]") 

需要弄清楚如何包含foo!

編輯3:韋爾普這將增加foo的:

body.xpath("//div[@class='foo'][1]","//div[@class='foo'] 
    [1]/following-sibling::div[@class='bar'] 
    [1 = count(preceding-sibling::div[@class='foo'][1] | (//div[@class='foo'])[1])]") 

但更大的問題是我不知道如何遍歷這個?它只是返回第一組foo +酒吧。

編輯4:通過FOO杆塊迭代:

var = 1 
loop do 
    chunk = body.xpath("//div[@class='foo'][#{var}]","//div[@class='foo'] 
    [#{var}]/following-sibling::div[@class='bar'] 
    [1 = count(preceding-sibling::div[@class='foo'][#{var}] | 
    (//div[@class='foo'])[1])]") 
    puts chunk 
    var += 1 
    break if chunk.length == 0 
end 

不知道如何來包裝他們的div現在。

回答

0

韋爾普我對這個瘋狂流行問題的追隨者可能不雅的解決方案:

var = 1 
loop do 
    chunk = body.xpath("//div[@class='foo'][#{var}]","//div[@class='foo'] 
    [#{var}]/following-sibling::div[@class='bar'] 
    [1 = count(preceding-sibling::div[@class='foo'][#{var}] | 
    (//div[@class='foo'])[1])]") 
    break if chunk.length == 0  
    var += 1 
    puts <div class="baz"> 
    puts chunk 
    puts </div> 
end