【问题标题】:How to strip comments from HTML using Agility Pack without losing DOCTYPE如何使用 Agility Pack 从 HTML 中删除注释而不丢失 DOCTYPE
【发布时间】:2011-09-27 21:22:56
【问题描述】:

我正在尝试从 HTML 中删除不必要的内容。具体来说,我想删除 cmets。我找到了一个很好的解决方案 (Grabbing meta-tags and comments using HTML Agility Pack),但是 DOCTYPE 被视为注释,因此与 cmets 一起被删除。如何改进以下代码以确保保留 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);
    }
}

【问题讨论】:

    标签: html-agility-pack


    【解决方案1】:
    doc.DocumentNode.Descendants()
     .Where(n => n.NodeType == HtmlAgilityPack.HtmlNodeType.Comment)
     .ToList()
     .ForEach(n => n.Remove());
    

    这将从文档中删除所有 cmets

    【讨论】:

    • 这似乎是更好的解决方案。
    【解决方案2】:

    检查评论是否以DOCTYPE开头

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

    【讨论】:

    • 安全吗?如果有像 这样的评论怎么办?我知道这是一个极端情况,但我想我的观点是:没有比检查评论节点的内容更好的方法吗?
    • 当它以 DOCTYPE 开头并且是根元素的第一个子元素时可能会忽略它?
    • 我做了一些测试,发现评论的内容实际上包括'codeif (!comment.InnerText.StartsWith("))code 我仍然希望有比将评论内容与硬编码字符串...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2017-09-25
    相关资源
    最近更新 更多