如何使用nokogiri获取属性值

时间:2012-07-23 00:52:44

标签: ruby dom xpath nokogiri

我有一个我不知道的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我希望在访问“my text”节点时遇到与每个元素节点关联的属性

约束是::我无法使用Web浏览器中提供的任何开发人员工具

PS ::我是红宝石和nokogiri的新手..

1 个答案:

答案 0 :(得分:1)

要选择使用XPath表达式someExpr选择的元素的所有属性,您需要评估新的XPath表达式:

someExpr/@*

其中someExpr必须替换为用于选择特定元素的实际XPath表达式。

这将选择Xpath表达式someExpr

选择的所有属性(我们假设只有一个)

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

/a/b/c 

然后通过以下方式选择其所有属性:

/a/b/c/@*