使用 HtmlAgilityPack 删除属性

Posted

技术标签:

【中文标题】使用 HtmlAgilityPack 删除属性【英文标题】:Remove attributes using HtmlAgilityPack 【发布时间】:2011-08-16 13:57:50 【问题描述】:

我正在尝试创建一个代码 sn-p 以删除所有 style 属性,而不管使用 htmlAgilityPack 的标签。

这是我的代码:

var elements = htmlDoc.DocumentNode.SelectNodes("//*");

if (elements!=null)

    foreach (var element in elements)
    
        element.Attributes.Remove("style");
    

但是,我没有让它坚持下去?如果我在Remove("style") 之后立即查看element 对象。我可以看到样式属性已被删除,但它仍然出现在DocumentNode 对象中。 :/

我觉得有点愚蠢,但对我来说似乎不对?有人使用 HtmlAgilityPack 做到这一点吗?谢谢!

更新

我将代码更改为以下内容,并且可以正常工作:

public static void RemoveStyleAttributes(this HtmlDocument html)

   var elementsWithStyleAttribute = html.DocumentNode.SelectNodes("//@style");

   if (elementsWithStyleAttribute!=null)
   
      foreach (var element in elementsWithStyleAttribute)
      
         element.Attributes["style"].Remove();
      
   

【问题讨论】:

可以加复制码吗?因为我已经测试过这个 html <html style='style1'><body style='style2'></body></html> 并且它有效 你使用 InnerHtml 属性吗?在撰写本文时,它有一个错误,请改用 WriteContentTo 方法。 【参考方案1】:

您的代码 sn-p 似乎是正确的 - 它删除了属性。问题是,DocumentNode .InnerHtml(我假设你监视了这个属性)是一个复杂的属性,它可能会在一些未知的情况下被更新,你实际上不应该使用这个属性来获取文件作为字符串。取而代之的是 HtmlDocument.Save 方法:

string result = null;
using (StringWriter writer = new StringWriter())

    htmlDoc.Save(writer);
    result = writer.ToString();

现在result 变量保存了文档的字符串表示形式。

还有一件事:可以通过将表达式更改为 "//*[@style]" 来改进您的代码,这只会让您获得具有 style 属性的元素。

【讨论】:

感谢您的回复!是的,我已将代码更改为以下内容以使其“粘贴”:'public static void RemoveStyleAttributes(this HtmlDocument html) var elementsWithStyleAttribute = html.DocumentNode.SelectNodes("//@style"); if (elementsWithStyleAttribute!=null) foreach (var element in elementsWithStyleAttribute) element.Attributes["style"].Remove(); ' 不知道为什么我的原始代码不起作用,但我认为你的猜测是正确的。谢谢! 哇,cmets 中的代码格式不是很好。 :) 用修改后的代码 sn-p 更新了我的问题。再次感谢!【参考方案2】:

这是一个非常简单的解决方案

VB.net

element.Attributes.Remove(element.Attributes("style"))

c#

element.Attributes.Remove(element.Attributes["style"])

【讨论】:

谢谢,更正一点:element.Attributes("style") 应该是 element.Attributes["style"] 你是对的,因为我没有说清楚:我的代码是用于 vb.net

以上是关于使用 HtmlAgilityPack 删除属性的主要内容,如果未能解决你的问题,请参考以下文章

htmlagilitypack - 删除脚本和样式?

HTMLAgilityPack 获取带有 id 属性的 td 标签的 innerText

HtmlAgilityPack,使用 XPath 包含方法和谓词

XPath/HtmlAgilityPack:如何查找具有属性 (href) 特定值的元素 (a) 并查找相邻的表列?

HtmlAgilityPack HTML操作类库的使用

求C# HtmlAgilityPack用法的完整例子。