2012-07-23 121 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/@*