2011-10-24 170 views
8

我有一些使用Nokogiri的代碼,我試圖在沒有得到評論的情況下獲得inner_html從inner_html刪除評論

html = Nokogiri::HTML(open(@sql_scripts_url[1])) #using first value of the array 
html.css('td[class="ms-formbody"]').each do |node| 
    puts node.inner_html # prints comments 
end 
+2

請提供一個示例HTML代碼段,以及在按摩後您想要的結果字符串。 – Phrogz

+0

我只需要從我的html中刪除像「<! - WHAT EVER - >」這樣的HTML註釋。我使用了strip並且它工作。我不知道這是否正確。 – Maverick

回答

12

既然你沒有提供任何樣本HTML或所需的輸出,這裏有一個通用的解決方案:

您可以選擇使用comment()節點測試中的XPath SGML的意見;您可以通過在所有評論節點上調用.remove將它們從文檔中刪除。說明:

require 'nokogiri' 
doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>') 
p doc.inner_html      #=> "<b>hello</b> <!-- foo --> world" 
doc.xpath('//comment()').remove 
p doc.inner_html      #=> "<b>hello</b> world" 

請注意,上述修改文件破壞性地刪除評論。如果您想保留原始文件未經修改的,你可以交替做:

class Nokogiri::XML::Node 
    def inner_html_reject(xpath='.//comment()') 
    dup.tap{ |shadow| shadow.xpath(xpath).remove }.inner_html 
    end 
end 

doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>') 
p doc.inner_html_reject #=> "<r><b>hello</b> world</r>" 
p doc.inner_html  #=> "<r><b>hello</b> <!-- foo --> world</r>" 

最後要注意的是,如果你不需要的標記,只是要求對於text本身不包含HTML註釋:

p doc.text    #=> "hello world" 
+0

我將嘗試使用第一種方法來實際解析.net配置文件,並用特定的部署環境值替換值並部署這些文件。 – Maverick

+4

甚至更​​短的是'doc.xpath('// comment()')。remove'一次刪除所有註釋。沒有必要列舉他們。 – akuhn

+1

@akuhn太棒了!我以前從未見過['Nokogiri :: XML :: NodeSet#remove'](http://nokogiri.org/Nokogiri/XML/NodeSet.html#method-i-remove)。謝謝。我相應地更新了我的答案(並且必須去更新網站上的其他答案;)。 – Phrogz