1

所以我写了一个代码来从面包屑中抓取当前类别的父类:

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

4

2 回答 2

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>

野小切

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"]
于 2013-09-07T10:26:35.160 回答
0

我会做:

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

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

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

于 2013-09-09T17:15:00.160 回答