如何从nokogiri对象获得标识符(例如xpath)



遍历nokogiri并使用xpath选择元素相当容易。我需要反之亦然,这意味着:我需要在nokogiri节点上调用.to_xpath以获得元素的完整xpath以将其存储在记录中。

有人知道怎么做吗?

我能想到的最简单的方法是:

Nokogiri::CSS.xpath_for node.css_path

EDIT:你也可以试试path方法

我能想到的最简单的事情是使用parent在每个节点上构建一个返回根(即返回<html>)和previous_element的元素路径,以找出该节点在其兄弟姐妹中的数字索引。因为只有一个<body><html>(如果有必要,Nokogiri会在你背后为你添加这些),你可以在到达<body>节点后停止向上走。

算法如下:

  1. 初始化:path = [ ], n是你已经有的节点。
  2. 设置s = n并调用s = s.previous_element直到s.nil?,并计算您进行了多少次迭代,这将为您提供n在其兄弟姐妹中的位置。把位置放在index中。请记住,XPath位置是基于一个的。
  3. 存储新的路径组件:path.unshift('*[' + index.to_s + ']') .
  4. 设置p = n.parent,如果p不是<body>,则设置n = p并返回步骤2。
  5. 添加我们知道的最终组件:path.unshift('body').unshift('html') .
  6. 构建XPath表达式:xpath = '/' + path.join('/')

如果有这样的HTML:

<ul><li>a</li><li><b>b<em>c</em></b></li></ul>

<em>c</em>的开始节点,您将得到如下所示的XPath:

/html/body/*[1]/*[2]/*[1]/*[1]

不是很漂亮,但至少过程相当简单,并且生成的XPath将是唯一的。

如果你需要到DOM中大多数节点的路径,那么你可以从根开始,并在向下的过程中对所有节点进行编号。这样你就可以避免一次又一次地遛兄弟姐妹了。

相关内容

  • 没有找到相关文章

最新更新