如何废弃Nokogiri的第二个最后一个锚链接?

时间:2013-09-07 08:38:48

标签: html ruby nokogiri

所以我编写了一个代码,用于从面包屑中删除当前类别的父级:

node_parent = @data.at_css(".bc a:nth-child(2)").text unless @data.at_css(".bc a:nth-child(2)").nil?

代码说:废弃第二个最后一个锚链接。这是HTML的结构:

<span class="bc">
  <a href="">Home</a>
  <span class="d">></span>
  <img src="" />
  <a href="/us/Apparel/1036682"">Apparel</a>
  <div class="node"></div>
  <a href="">...</a>
  <span class="d">></span>
  Baby
</span>

因此,在这种情况下,代码会废弃Apparel

问题是代码在这种情况下会失败:

<span class="bc">
  <a href="">Home</a>
  <span class="d">></span>
  <img src="" />
  Apparel
</span>

由于没有第二个最后一个锚链接。

对此有什么更好的解决方案?

网页的实例:

http://www.findbrowsenodes.com/us/Apparel/1036682 http://www.findbrowsenodes.com/us/Apparel/2402554011

2 个答案:

答案 0 :(得分:1)

在回答你的问题之前,我采用了类似的例子 html ,如下所示: -

<span class="bc">
  <a href="">Home</a>
  <a href="">foo</a>
</span>
<span class="bc">
  <a href="">Home</a>
</span>
<span class="bc">
  <a href="">Home</a>
  <a href="">bax</a>
  <a href="">baz</a>
</span>

<强> Xpath的: -

 //span[@class='bc'][count(./a)>1]/a[count(following-sibling::a)=1]

<强>输出: -

  <a href="">Home</a>
  <a href="">bax</a>

<强>引入nokogiri

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse <<-eotl
<span class="bc">
  <a href="">Home</a>
  <span class="d">></span>
  <img src="" />
  <a href="/us/Apparel/1036682">Apparel</a>
  <div class="node"></div>
  <a href="">...</a>
  <span class="d">></span>
  Baby
</span>
<span class="bc">
  <a href="">Home</a>
  <span class="d">></span>
  <img src="" />
  Apparel
</span>
   eotl

doc.xpath("//span[@class='bc'][count(./a)>1]/a[count(following-sibling::a)=1]").map(&:text)
# => ["Apparel"]

答案 1 :(得分:0)

我愿意:

anchors = doc.css('a')
second_last_anchor = (anchors.length >= 2) ? anchors[-2] : anchors[0]

这基本上获取了doc中的所有链接。如果有2个或更多链接,则返回倒数第二个,即[-2]索引。如果只有一个链接,它将返回一个。否则,如果没有链接,则返回nil。

doc是整个html页面,但您可以使用您想要检查的任何特定节点。