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

Ruby 如何从nokogiri对象获取标识符(例如xpath)?,ruby,ruby-on-rails-3,xpath,nokogiri,Ruby,Ruby On Rails 3,Xpath,Nokogiri,遍历nokogiri并使用xpath选择元素相当容易。我需要反过来,意思是:我需要调用nokogiri节点上的.to_xpath,以获取元素的完整xpath,并将其存储在记录中 有人知道这样做的方法吗?我能想到的最简单的事情是,使用它构建一个元素路径,返回到根(即返回到),并在每个节点上计算该节点在其同级节点中的数字索引。由于只有一个和(如有必要,Nokogiri会在你背后为你添加这些),一旦你点击节点,你就可以停止向父母走去 算法如下所示: <ul><li>a</

遍历nokogiri并使用xpath选择元素相当容易。我需要反过来,意思是:我需要调用nokogiri节点上的
.to_xpath
,以获取元素的完整xpath,并将其存储在记录中


有人知道这样做的方法吗?

我能想到的最简单的事情是,使用它构建一个元素路径,返回到根(即返回到
),并在每个节点上计算该节点在其同级节点中的数字索引。由于只有一个
(如有必要,Nokogiri会在你背后为你添加这些),一旦你点击
节点,你就可以停止向父母走去

算法如下所示:

<ul><li>a</li><li><b>b<em>c</em></b></li></ul>
  • 初始化:
    path=[]
    n
    是您已经拥有的节点
  • 设置
    s=n
    并调用
    s=s.previous_元素
    直到
    s.nil?
    并计算您进行了多少次迭代,这将为您提供
    n
    在其同级中的位置。将位置置于
    索引中
    。请记住,XPath位置是基于一个的
  • 存储新路径组件:
    path.unshift('*['+index.to_s+']')
  • 设置
    p=n.parent
    ,如果
    p
    不是
    ,则
    n=p
    并返回步骤2
  • 添加我们知道的最后一个组件:
    path.unshift('body')。unshift('html')
  • 构建XPath表达式:
    XPath='/'+path.join('/')
  • 下面给出一些HTML:

    <ul><li>a</li><li><b>b<em>c</em></b></li></ul>
    
    不完全是漂亮的,但至少过程相当简单,结果XPath将是唯一的


    如果需要指向DOM中大多数节点的路径,那么可以从根节点开始,并对向下的所有节点编号。这样你就可以避免一次又一次地和兄弟姐妹散步。

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

    Nokogiri::CSS.xpath_用于node.CSS_路径


    EDIT:您也可以尝试一下
    path
    方法。

    XML还是HTML?你所有的节点都有
    id
    属性吗?这是html,它们没有任何id节点,因为使用了自定义html标记,这些标记会被动态替换和倍增。你可能想使用Serabe的,但无论如何我都会留下我的。很抱歉,如果我的隧道视野让你做了比必要的更多的工作。无论如何,感谢你的详细解决方案,尽管我喜欢它。在文档中也找不到我需要的内容:)@pduersteler:您可能想添加一些测试,以确保正确获得0/1/多个兄弟姐妹的编号。谢谢。Nokogiri是一个很好的库,它提供了几乎所有你能想到的方法。只要看到css_路径也会起作用,这可能会加快速度。谢谢