2012-07-23 92 views
2

我有一个网页,其DOM结构我不知道...但我知道我需要在那个特定的网页中找到的文本..所以为了得到它的xpath我做了什么是:如何使用nokogiri获取属性值

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 } 

我不是面临的问题中搜索节点,其中“我的文字”谎言。我想有“我的文字” node..thts为什么我做了充分的XPath整个遍历...现在找到完整的xpath后,我想要的属性与我在遇到“我的文本”节点时遇到的每个元素节点相关联

约束是::我不能使用任何开发人员工具在网络浏览器中可用

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

+0

您对哪些属性感兴趣?为了获得具有所需测试的节点列表,您可以使用'//*[.='my text']'。这将使所有节点返回文本“我的文本”。 – 2012-07-23 07:27:36

+0

我正在寻找上述高亮输出中所有元素节点的所有属性...现在它可能发生的一些节点可能或可能不具有属性节点...所以我想要一个哈希: :元素节点=>属性值... btw感谢输入..我已经更新了问题.. – 2012-07-23 08:17:43

回答

1

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

someExpr/@* 

其中someExpr必须与所用的实际的XPath表达式被取代以选择特定的元件。

这将选择所有的所有属性(我们假设只有一个),其通过XPath表达式someExpr

例如选择的元素,如果我们想要的元素由选自:

/a/b/c 

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

/a/b/c/@*