使用 C# 解析 HTML 以获取内容

Posted

技术标签:

【中文标题】使用 C# 解析 HTML 以获取内容【英文标题】:Parsing HTML to get content using C# 【发布时间】:2011-01-03 12:45:38 【问题描述】:

我正在编写一个抓取我的一组网页的应用程序。而不是获取页面的整个源代码,我想获取所有内容并将其存储并能够将页面作为纯文本存储在数据库中。内容将在其他应用程序中使用,并且不会被用户阅读,因此无需完全可读。

起初,我在考虑使用正则表达式,但我无法控制网页的有效性,而且很有可能没有正则表达式会给我内容。

如果我的源代码包含在一个字符串中,我如何才能将该源代码字符串转换为 C# 中的内容?

【问题讨论】:

定义“只是内容”......所有的html都是内容,所以你可以只存储html。你的意思是“只有文字,没有标记”?还是什么? 为什么你不“XML”解析它们? ,这样你就可以读取节点并决定只获取内容......但是我不确定XML解析是否可以读取自闭合标签.. XML 支持自闭合标签,但不幸的是,许多所谓的 HTML 文档不幸包含许多格式错误的标签。 几乎“只是文本”,虽然我不同意 HTML 是内容,因为对我来说它只是用作结构,存储它是没有意义的。 @EnderMB - 在这种情况下,我添加了一个使用 HTML Agility Pack 的示例 【参考方案1】:

请,请不要自己解析 HTML!您不能只使用标准正则表达式来解析 HTML - 这是不可能的。

那里有大量的免费图书馆。 HTML Agility Pack 是 .NET 世界中最好的免费软件之一。

HTML Agility Pack 也支持格式错误的文档,这是正则表达式或其他基本解析(如 XML)几乎不会做的事情。

【讨论】:

【参考方案2】:

不是 100% 清楚你想要什么,但我假设你想要文本减去标记;所以:

string html;
// obtain some arbitrary html....
using (var client = new WebClient()) 
    html = client.DownloadString("http://***.com/questions/2038104");

// use the html agility pack: http://www.codeplex.com/htmlagilitypack
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
StringBuilder sb = new StringBuilder();
foreach (HtmlTextNode node in doc.DocumentNode.SelectNodes("//text()")) 
    sb.AppendLine(node.Text);

string final = sb.ToString();

【讨论】:

当我使用此代码解析谷歌主页以搜索文本时,我得到的只是大量的 javascript。无论如何要避免这种情况? @WinCoder :这是从页面内容中删除 JavaScrip 和 CSS 的方法:***.com/questions/13441470/…【参考方案3】:

以下函数将有助于从 html 字符串中删除所有 HTML 标签、脚本、css、样式并将其转换为纯文本。 view source

private string GetPlainTextFromHtml(string htmlString)

    string htmlTagPattern = "<.*?>";
    var regexCss = new Regex("(\\<script(.+?)\\</script\\>)|(\\<style(.+?)\\</style\\>)", RegexOptions.Singleline | RegexOptions.IgnoreCase);
    htmlString = regexCss.Replace(htmlString, string.Empty);
    htmlString = Regex.Replace(htmlString, htmlTagPattern, string.Empty);
    htmlString = Regex.Replace(htmlString, @"^\s+$[\r\n]*", "", RegexOptions.Multiline);
    htmlString = htmlString.Replace("&nbsp;", string.Empty);

    return htmlString;

【讨论】:

【参考方案4】:

我编写了代码来从标记中去除原始文本,并将其呈现在我的文章 Convert HTML to Text 中。呈现的代码非常简单和轻量级。

我还写了一个轻量级的 HTML 解析器,并在 Github 上发布了 HTML Monkey。这将是一个更完整的解决方案,并且将已解析的标记转换为仅获取文本将是一项简单的任务。我仍在从事这个项目,并正在寻找有关其工作方式的反馈。

【讨论】:

以上是关于使用 C# 解析 HTML 以获取内容的主要内容,如果未能解决你的问题,请参考以下文章

如何解析图像标签的 HTML 字符串以获取 SRC 信息?

解析 JWT 以获取 C# 中的声明

C# 解析字符串/innerhtml 以获取特定数据

C#使用SOAP获取webservice实例解析

解析 HTML 页面以获取 <p> 和 <b> 标记的内容

在不断更新的 C# 中解析 HTML