2013-01-07 77 views
4

加載了(X)HTML頁面後,我試圖獲取元標記「內容」屬性的值。例如,給出:嘗試使用Nokogiri和自定義僞類提取屬性值CSS選擇器

<meta name="author" content="John Smith" /> 

我想提取值「John Smith」。

我知道,使用XPath和理解CSS主要是意味着元素選擇,但引入nokogiri支持定義custom CSS pseudoclasses,我認爲可以用如下的事:

class CSSext 
    def attr(nodeset, tag) 
    nodeset.first.attribute_nodes.find_all {|node| node.name == tag} 
    end 
end 

doc = Nokogiri::HTML(open(someurl)) 
doc.css("meta[name='name']:attr('content')", CSSext.new) 

然而,這將返回相同的結果as

doc.css("meta[name='name']") 

是什麼給出的? Nokogiri在CSS和XPath搜索中使用相同的引擎,所以XPath中可能的任何內容都應該可以在CSS中執行。我應該如何去提取屬性值?

+0

爲什麼不採取簡單的路徑並使用'doc.css(「meta [name ='name']」)'? Nokogiri中的CSS是任何節點查找中XPath的非常有用的替代品。做簡單的事情,這使得它更容易理解和維護。 –

+0

@Scott Roepnack:這不是[適當使用反引號](http://stackoverflow.com/editing-help#code-spans)進行格式化。還請注意,你已經導致鏈接Markdown打破以及... – BoltClock

+0

@BoltClock謝謝 –

回答

5

爲什麼不只是?

doc.at("meta[name='author']")['content'] 

據我瞭解,僞類可用於僅篩選節點集,但不能取代其他值節點集,如節點的屬性之一的值。

+0

這將給一個錯誤。你想要'at_css',或者只需'at'' – pguardiario

+0

正確,謝謝@pguardiario – akuhn