【问题标题】:Remove comments from inner_html从 inner_html 中删除评论
【发布时间】:2011-10-29 04:20:06
【问题描述】:

我有一些使用 Nokogiri 的代码,我试图在不获取 cmets 的情况下获取 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

【问题讨论】:

  • 请提供一个示例 HTML sn-p,以及按摩后您想要的结果字符串。
  • 我只需要从我的 html 中删除 HTML cmets,例如“”。我用了条,它起作用了。我不知道这是否是正确的方式。

标签: ruby nokogiri


【解决方案1】:

由于您没有提供任何示例 HTML 或所需的输出,这里有一个通用的解决方案:

您可以使用comment() 节点测试在XPath 中选择SGML cmets;您可以通过在所有评论节点上调用 .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"

请注意,以上内容会破坏性地修改文档以删除 cmets。如果您希望保持原始文档不被修改,您也可以这样做:

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 cmets:

p doc.text              #=> "hello  world"

【讨论】:

  • 我将尝试使用第一种方法来实际解析 .net 配置文件并将值替换为特定的部署环境值并部署这些文件。
  • 更短的是doc.xpath('//comment()').remove,它会一次性删除所有的cmets。无需一一列举。
  • @akuhn 太棒了!我以前没有见过Nokogiri::XML::NodeSet#remove。谢谢你。我已经相应地更新了我的答案(并且必须去更新网站上的其他答案;)。
  • 如果你有一个片段而不是一个文档...stackoverflow.com/questions/40787659/…
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2013-01-14
  • 1970-01-01
  • 2022-11-10
  • 2021-05-01
相关资源
最近更新 更多