2

我有一个网页,我不知道其 DOM 结构......但我知道我需要在该特定网页中找到的文本......所以为了获得它的 xpath,我要做的是:

doc = Nokogiri::HTML(webpage)
doc.traverse { |node|
  if node.text?
    if node.content == "my text"
      path << node.path
    end
  end
}
puts path

现在假设我得到一个像 ::

   html/body/div[4]/div[8]/div/div[38]/div/p/text()

这样以后当我再次访问该网页时,我可以这样做::

    doc.xpath("#{path[0]}")

而不是每次我想要文本时都遍历整个 DOM 树

我想做一些进一步的处理,因为我需要知道上述 xpath 输出中的哪些元素节点具有与之关联的属性以及它们的属性值是什么。我将如何实现这一目标?我想要的输出是

    #=> output desired
{ p => p_attr_value , div => div_attr_value , div[38] => div[38]_attr_value.....so on }

我在搜索“我的文本”所在的节点时没有遇到问题..我想拥有“我的文本”节点的完整 xpath..这就是为什么我做了整个遍历......现在在找到完整的 xpath 之后我想要与我在到达“我的文本”节点时遇到的每个元素节点关联的属性

限制是 ::我无法使用 Web 浏览器中可用的任何开发人员工具

PS :: 我是 ruby​​ 和 nokogiri 的新手。

4

1 回答 1

1

要选择使用 XPath 表达式选择的元素的所有属性someExpr,您需要计算一个新的 XPath 表达式:

someExpr/@*

wheresomeExpr必须替换为用于选择特定元素的真实 XPath 表达式。

这将选择 Xpath 表达式选择的所有(我们假设这只是一个)元素的所有属性someExpr

例如,如果我们想要的元素是通过以下方式选择的:

/a/b/c 

那么它的所有属性都是通过以下方式选择的:

/a/b/c/@*
于 2012-07-23T13:22:34.463 回答