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

时间:2011-08-19 06:47:19

标签: ruby ruby-on-rails-3 xpath nokogiri

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

任何人都知道这样做的方法吗?

2 个答案:

答案 0 :(得分:11)

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

Nokogiri::CSS.xpath_for node.css_path

编辑:您也可以尝试path方法。

答案 1 :(得分:1)

我能想到的最简单的事情就是使用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('/')
  7. 所以给出了像这样的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中大多数节点的路径,那么您可以从根目录开始,并在路上向所有节点编号。这样你就可以避免一遍又一遍地走兄弟姐妹。