【问题标题】:Get all tags followings a certain with mechanize ? (ruby)使用 mechanize 获取特定的所有标签? (红宝石)
【发布时间】:2017-12-16 18:14:25
【问题描述】:

我怎样才能让所有元素都跟随一次,比如:

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

我需要检测&lt;h2 class="target"&gt;并将所有标签获取到下一个&lt;h4&gt;并忽略&lt;h4&gt;AND所有以下标签(如果&lt;h4&gt;不存在,我必须获取所有标签到父母的结尾[这里:&lt;div&gt;])

内容是动态的和不可预测的 唯一的规则是:我们知道有一个目标并且有一个(或元素结尾)。我需要获取两者之间的所有标签并排除所有其他标签。

通过这个例子,我需要获得以下 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方法,但是如何测试当前节点的tag类型呢?

我想用类似的方法来处理节点树:

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

我该怎么做?

【问题讨论】:

  • 这更像是一个xpathcss-selectors 的问题,而不是关于机械化的问题。如果你添加了这些,你会得到更多的观众。

标签: ruby xpath css-selectors nokogiri mechanize-ruby


【解决方案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)]

【讨论】:

  • 这不完全是,它需要停在h4,而不是仅仅排除它。
  • 我编辑了问题,抱歉不精确,但我们不知道

    之后可能存在的标签的数量和类型,所以我需要忽略

    以来的所有标签(包括) .我不能做一个可靠的 xpath cmd,因为内容是动态的和不可预测的!

  • @Matrix 您当然可以在 XPath 中完成!查看我的编辑。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我不知道获取标签类型这么容易(使用.name)。我的用例给出了这个:el = page.at('#Nom_commun').parent html = el.inner_html el = el.at('+ *') while el &amp;&amp; el.name != 'h4' html &lt;&lt; el.inner_html el = el.at('+ *') end
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
相关资源
最近更新 更多