2011-10-24 132 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