【问题标题】:Does .NET framework offer methods to parse an HTML string?.NET 框架是否提供解析 HTML 字符串的方法?
【发布时间】:2025-12-14 06:05:01
【问题描述】:

知道我不能使用 HTMLAgilityPack,只能直接使用 .NET,假设我有一个字符串,其中包含一些我需要以这种方式解析和编辑的 HTML:

  • 在层次结构中按 id 或标签查找特定控件
  • 修改(最好是创建)这些找到的元素的属性

.net 中有可用的方法吗?

【问题讨论】:

  • 我知道...use regex
  • 我不知道...不要使用正则表达式*.com/questions/1732348/…
  • 如果您的 HTML 恰好是 XHTML,那么您可以使用标准 XML 库对其进行解析、遍历和修改。
  • 简短的回答是否定的。 Agility Pack 是最接近经批准的 (.NET) HTML 解析器的东西。
  • 为什么“我不能使用 HTMLAgilityPack”?排除一个非常好的(甚至是免费的)工具似乎很愚蠢。

标签: c# .net html parsing


【解决方案1】:

HtmlDocument

GetElementById

HtmlElement

您可以创建一个虚拟的 html 文档。

WebBrowser w = new WebBrowser();
w.Navigate(String.Empty);
HtmlDocument doc = w.Document;
doc.Write("<html><head></head><body><img id=\"myImage\" src=\"c:\"/><a id=\"myLink\" href=\"myUrl\"/></body></html>");
Console.WriteLine(doc.Body.Children.Count);
Console.WriteLine(doc.GetElementById("myImage").GetAttribute("src"));
Console.WriteLine(doc.GetElementById("myLink").GetAttribute("href"));
Console.ReadKey();

输出:

2

file:///c:

关于:我的网址

编辑元素:

HtmlElement imageElement = doc.GetElementById("myImage");
string newSource = "d:";
imageElement.OuterHtml = imageElement.OuterHtml.Replace(
        "src=\"c:\"",
        "src=\"" + newSource + "\"");
Console.WriteLine(doc.GetElementById("myImage").GetAttribute("src"));

输出:

文件:///d:

【讨论】:

  • 这需要您在 Winforms 控件中加载文档。
  • 如果我错了,请纠正我,但这需要一个 webBrowser 控件并且不允许直接解析 HTML 字符串。
  • @JellyAma,是的,但这不是您在“修改(并理想地创建)那些找到的元素的属性”中想要的吗?
  • @Alexei,最重要的是,我需要解析 HTML 字符串。
【解决方案2】:

假设您正在处理格式良好的 HTML,您可以简单地将文本视为 XML 文档。该框架加载了完全符合您要求的功能。

http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

【讨论】:

  • 尝试解析这个格式良好的 html。 &lt;html&gt;&lt;body&gt;line1
    line2&lt;/body&gt;&lt;/html&gt;
【解决方案3】:

除了 HTML Agility Pack 和将 HtmlUnit 移植到 C# 之外,听起来可靠的解决方案是:

  • 最明显 - 使用正则表达式。 (System.Text.RegularExpressions)
  • 使用 XML 解析器。 (因为 HTML 是一个标签系统,将其视为 XML 文档?)
  • Linq?

我知道的一件事是解析像 XML 这样的 HTML 可能会导致您遇到一些问题。 XML 和 HTML 不一样。阅读:here

另外,这里有一篇关于Linq vs Regex.的帖子

【解决方案4】:

您可以查看 HTML Agility Pack 的工作原理,但它是 .Net。您可以反映程序集并查看它正在使用 MFC,并且可以根据需要进行复制,但您只会移动程序集,而不是使其成为 .Net。

【讨论】: