如何使用Agility Pack从HTML中删除注释而不丢失DOCTYPE

12
我正在尝试从 HTML 中删除不必要的内容,特别是我想要删除注释。我找到了一个相当不错的解决方案(使用 HTML Agility Pack 获取 meta 标签和注释),但是 DOCTYPE 被视为注释,因此随着注释一起被删除了。如何改进以下代码以确保 DOCTYPE 被保留?
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlContent);
var nodes = htmlDoc.DocumentNode.SelectNodes("//comment()");
if (nodes != null)
{
    foreach (HtmlNode comment in nodes)
    {
        comment.ParentNode.RemoveChild(comment);
    }
}
2个回答

25
doc.DocumentNode.Descendants()
 .Where(n => n.NodeType == HtmlAgilityPack.HtmlNodeType.Comment)
 .ToList()
 .ForEach(n => n.Remove());

这将从文档中剥离所有注释


这似乎是更好的解决方案。 - Alejandro Gonzalez

9

检查评论是否不以DOCTYPE开头

  foreach (var comment in nodes)
  {
     if (!comment.InnerText.StartsWith("DOCTYPE"))
         comment.ParentNode.RemoveChild(comment);
  }

这安全吗?如果有像<!--DOCTYPE blablabla -->这样的注释怎么办?我知道这是一个边缘情况,但我的观点是:难道没有比检查注释节点内容更好的方法吗? - desautelsj
也许可以忽略它,当它以DOCTYPE开头并且是根元素的第一个子元素时? - Richard Schneider
我进行了一些测试,发现注释的内容实际上包括'<!'。这意味着我可以稍微改进您的建议:codeif (!comment.InnerText.StartsWith("<!DOCTYPE"))code 我仍然希望有比将注释内容与硬编码字符串进行比较更好的解决方案... - desautelsj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接