2017-07-12 81 views
1

如何,我可以得到以下,一旦所有元素,如:通过机械化获得所有标签追踪信息? (红宝石)

<div id="exemple"> 
    <h2 class="target">foo</h2> 
    <p>bla bla</p> 
    <ul> 
    <li>bar1</li> 
    <li>bar2</li> 
    <li>bar3</li> 
    </ul> 
    <h4>baz</h4> 
    <ul> 
    <li>lot</li> 
    </ul> 
    <div>of</div> 
    <p>possible</p> 
    <p>tags</p> 
    <a href="#">after</a> 
</div> 

我需要检测<h2 class="target">,并得到所有标签到下一个<h4>而忽略<h4>所有如下标签(如果<h4>不存在,我必须让所有标签的父结束[此处的<div>结束])

的内容是动态的和不可预知的唯一的规则就是:我们知道有一个目标,有一个(或结束的元素) 。我需要获得所有标签,并排除所有其他标签。

有了这个为例,我需要得到HTML如下:

<h2 class="target">foo</h2> 
<p>bla bla</p> 
<ul> 
    <li>bar1</li> 
    <li>bar2</li> 
    <li>bar3</li> 
</ul> 

这样我就可以得到:target = page.at('#exemple .target') 我知道next_sibling方法,但我怎么可以测试当前节点的标签的类型?

我想类似的东西当然节点树:

html = '' 
while not target.is_a? 'h4' 
    html << target.inner_html 
    target = target.next_sibling 

我怎样才能做到这一点?

+1

这更多的是一个[标签:XPath]中的或[标签:CSS选择器]的问题比它大约机械化。如果你添加了这些,你会得到更多的观众。 –

回答

1

你可以从你的节点集中减去你不想要的值:

h2 = page.at('h2') 
(h2.search('~ *') - h2.search('~ h4','~ h4 ~ *')).each do |el| 
    # el is not a h4 and does not follow a h4 
end 

也许它使用xpath更有意义,但我可以做到这一点没有谷歌搜索。

你遍历一个同级可以工作过的想法:

el = page.at('h2 ~ *') 
while el && el.name != 'h4' 
    # do something with el 
    el = el.at('+ *') 
end 
+0

Thx,我不知道是如此容易得到类型的标签(使用'.name')。我的用例给了这个:'el = page.at('#Nom_commun')。parent html = el.inner_html el = el.at('+ *') while el && el.name!='h4' html << el.inner_html el = el.at('+ *') end' – Matrix

1

看起来你想要返回h2元素及其后续的兄弟姐妹。我不清楚您是要保留还是丢弃h4;如果你想保持它的XPath是:

//h2[@class="target"] | //h2[@class="target"]/following-sibling::* 

如果需要排除h4

//h2[@class="target"] | //h2[@class="target"]/following-sibling::*[not(self::h4)] 

编辑:如果您需要排除h4和任何超越:

//h2[@class="target"] | //h2[@class="target"]/following-sibling::*[not(self::h4) | not(preceding-sibling::h4)] 
+0

这不完全是它,它需要停在'h4',而不仅仅是排除它。 – pguardiario

+0

我编辑的问题,关于不精确性,但我们不知道有多少和现有标记类型

,所以我需要忽略自

(包含)以来的所有标记。我无法做一个固定的xpath cmd,因为内容是动态的和不可预测的! – Matrix

+0

@Matrix你当然可以在XPath中做到这一点!看我的编辑。 –

相关问题