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>
我在 .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>