HtmlAgilityPack - 删除所有属性

HtmlAgilityPack - Remove All Attributes

我在 .Net Core 2.2 下使用 HtmlAgilityPack 1.11.18。

我想从 HTML 片段(不是完整文档)中的 <p> 个节点中删除所有 HTML 属性。

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(input);

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p");

foreach (var node in pNodes)
{
    node.Attributes.Remove();
}

return htmlDoc.Text;

这不是把戏,我是不是漏掉了什么?方法 returns a string 应该是片段减去所有 <p> 元素上的属性。

我知道你不应该使用 RegEx 来解析 HTML,但这些都是小片段,我更喜欢 RegEx 方法,这样我就可以删除对 HtmlAgilityPack 的依赖,我只带来了干净利落地处理这件事。

I would prefer a RegEx method so I can remove the dependency on HtmlAgilityPack, which I only brought in to handle this cleanly.

那么为什么不用它来完成这样的任务呢?听起来您只想将 <p[^>]*> 更改为 <p>*

This is not doing the trick, am I missing something?

是的。 HtmlDocument class 更像是 bacis class,它包含 HTML Agility Pack 在解析文档之前需要了解的所有内容以及 DOM 结构中的任何更改它所持有的不会在这里反映出来。我一直倾向于使用: return htmlDoc.DocumentNode.WriteTo(); 作为 "the most proper" 方式而不是返回 htmlDoc.Text.

试试下面这个例子:

private static string foo()
{
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml("<div><p class=\"ok\">text</p></div>");

    var pNodes = htmlDoc.DocumentNode.SelectNodes("//p");

    foreach (var node in pNodes)
    {
        node.Attributes.Remove();
    }

    return htmlDoc.DocumentNode.WriteTo();
}

*正如@Progman 提到的那样,这是一个坏主意,这里是示例原因:

  • 输入:<div><p class=\"ok\" <!-- comment-->>text</p></div>(因此您可以在评论中添加任何内容,正则表达式无法处理)
  • HTML 敏捷包的输出:<div><p></p><!-- comment-->>text</div>