2012-01-22 29 views
1

我正在研究一個vim rspec插件(https://github.com/skwp/vim-rspec) - 我解析了一些rspec的html。它看起來像這樣:Hpricot:如何提取沒有其他html子元素的內部文本

doc = %{ 
<dl> 
    <dt id="example_group_1">This is the heading text</dt> 
    Some puts output here 
</dl> 
} 

我能得到利用的整個內:使用

(Hpricot.parse(doc)/:dl).first/:dt 

(Hpricot.parse(doc)/:dl).first.inner_html 

我能得到公正的DT但我怎麼能訪問「有些將輸出放在這裏」區域?如果我使用inner_html,則有太多其他垃圾需要解析。我已經瀏覽過hpricot文檔,但沒有看到一個簡單的方法來獲取html元素的內部文本,忽略了它的html子元素。

+0

隨着引入nokogiri這將是'Nokogiri.XML(文件,:noblanks)。.at_xpath( '/ DL /文()')的內容。帶' – Phrogz

+1

我會建議編寫你的插件,以便它可以與Nokogiri和Hpricot一起工作。 Nokogiri已經成爲Ruby XML/HTML解析的事實標準。 –

回答

0
  1. 請注意,這是您在那裏的錯誤HTML。如果你有控制權,你應該把你想要的內容包裝在<dd>中。

  2. 以XML的形式,您正在尋找的是TextNode,它跟在<dt>元素後面。在我的評論中,我展示瞭如何在Nokogiri中使用XPath選擇此節點。

  3. 但是,如果必須使用角度來說,Hpricot,並利用它不能選擇文本節點,那麼你可以通過獲取inner_html,然後剝離掉不需要破解這樣的:

    (Hpricot.parse(doc)/:dl).first.inner_html.sub %r{<dt>.+?</dt>}, '' 
    
1

我結束了搞清楚我自己的路線,通過手動解析孩子:

(@context/"dl").each do |dl| 
    dl.children.each do |child| 
    if child.is_a?(Hpricot::Elem) && child.name == 'dd' 
     # do stuff with the element 
    elsif child.is_a?(Hpricot::Text) 
     text=child.to_s.strip 
     puts text unless text.empty? 
    end 
    end 
相關問題