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

C# 使用C解析HTML以获取内容#,c#,string,html-parsing,C#,String,Html Parsing,我正在编写一个应用程序,它可以对我的一组网页进行爬网。我不想获取页面的全部源代码,而是希望获取所有内容并将其存储,并且能够将页面作为纯文本存储在数据库中。这些内容将在其他应用程序中使用,不会被用户读取,因此不需要完全为人类可读 起初,我考虑使用正则表达式,但我无法控制网页的有效性,而且很有可能没有正则表达式提供内容 如果源代码包含在一个字符串中,如何将该字符串的源代码转换为C#中的内容 请不要自己解析HTML!您不能仅使用标准正则表达式来解析HTML—这是不可能的 那里有很多免费图书馆。NET世

我正在编写一个应用程序,它可以对我的一组网页进行爬网。我不想获取页面的全部源代码,而是希望获取所有内容并将其存储,并且能够将页面作为纯文本存储在数据库中。这些内容将在其他应用程序中使用,不会被用户读取,因此不需要完全为人类可读

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

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

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

那里有很多免费图书馆。NET世界上最好的免费软件之一是


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

您想要什么还不是100%清楚,但我假设您想要文本减去标记;因此:

string html;
// obtain some arbitrary html....
using (var client = new WebClient()) {
    html = client.DownloadString("http://stackoverflow.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();

下面的函数将帮助从HTML字符串中删除所有HTML标记、脚本、css和样式,并将其转换为纯文本

私有字符串GetPlainTextFromHtml(字符串htmlString)
{
字符串htmlTagPattern=“”;

var regexCss=new Regex(“(\\我编写的代码将原始文本从标记中剥离出来,并在我的文章中呈现出来。呈现的代码非常简单且轻量级


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

Define“仅定义内容”“…所有的html都是内容,所以你可以只存储html。你是说“只有文本,没有标记”?还是什么?为什么不使用“XML”解析它们?通过这种方式,您可以读取节点并决定只获取内容…但是我不确定XML解析是否可以读取自动关闭标记。XML支持自动关闭标记,但不幸的是,许多所谓的HTML文档不幸包含许多格式不正确的标记。几乎“只包含文本”,虽然我不同意HTML是内容,但对我来说,它只是一种结构,存储它是毫无意义的。@enderb-在这种情况下,我添加了一个使用HTML Agility PackWhen的示例,当我使用此代码解析谷歌主页搜索文本时,我得到的是大量javascript。无论如何,为了避免这种情况?@WinCoder:这就是你的方式u从页面内容中删除JavaScrip和CSS:
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;
}