整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「C#实战」一行代码搞定!高效移除HTML标签还原纯净文本

HTML文本中移除所有HTML标记并提取纯文本是我们经常需要使用的文本内容处理方式,比如搜索引擎、网站爬虫或者本地文档检索系统需要提取网页或HTML文档的实际内容进行索引。通过去除HTML标签,可以专注于实际的文字信息,提高搜索结果的相关性和准确性。在新闻聚合应用或社交媒体平台上展示网页链接的摘要时,通常会提取并显示纯文本内容以提供简洁的预览。对于视觉障碍人士使用的辅助技术如屏幕阅读器,它们无法解析复杂的HTML结构,因此需要提取纯文本以便朗读给用户。所以今天给大家分享一个使用正则表达式移除所有的Html标记的方法,供有需要的朋友们参考:

第一个核心代码是:正则表达式"<.*?>"

// 示例用法:

string inputHtml = "<html><body><h1>Hello, World!</h1>This is a <b>test</b>.</body></html>";

string plainText = RemoveHtmlTags(inputHtml);

Console.WriteLine(plainText); // 输出: "Hello, World!This is a test."

public static string RemoveHtmlTags(string html)

{

// 正则表达式用于匹配HTML标签

Regex regex = new Regex("<.*?>", RegexOptions.Singleline | RegexOptions.Compiled);

// 使用正则表达式的Replace方法移除所有匹配的HTML标签

string result = regex.Replace(html, String.Empty);

return result;

}

这个正则表达式<.*?>是非贪婪匹配任何以 < 开始、以 > 结束的字符串,它会尽可能少地匹配字符以找到每个HTML标签。

请注意,虽然此方法对于简单场景可能有效,但对复杂的HTML文档(特别是含有嵌套标签、注释、CDATA等内容)可能不够健壮,因为它无法处理所有可能的HTML结构。

第二个核心代码是:正则表达式"<[^>]*>"

public static string ExtractPlainTextFromHtml(string html)

{

// 使用正则表达式匹配所有的HTML标签

// 注意:这个简单的正则表达式适用于大多数基础HTML结构,但可能无法处理复杂嵌套或特殊格式的HTML

Regex regex = new Regex("<[^>]*>", RegexOptions.Singleline | RegexOptions.Compiled);

// 使用Replace方法去除所有匹配到的HTML标签,并返回纯文本内容

string plainText = regex.Replace(html, String.Empty);

return plainText.Trim(); // 为了得到更整洁的结果,可以对结果进行trim操作以去除多余的空白字符

}

在这段代码中,我们定义了一个名为ExtractPlainTextFromHtml的方法,该方法利用正则表达式 <[^>]*> 来查找并替换所有HTML标签。这里的正则表达式表示任何以 < 开始、以 > 结束的非空字符串(即HTML标签),Singleline 选项使.能匹配换行符,以便跨多行搜索标签,而 Compiled 选项则是为了优化正则表达式的性能。

第二个核心代码是:正则表达式"<[^>]*>"

public static string RemoveHtmlTags(string html)

{

// 正则表达式,匹配所有HTML标签

string pattern = "<[^>]+>";

// 使用Regex.Replace方法移除所有匹配的HTML标签

return Regex.Replace(html, pattern, String.Empty);

}

请注意,此方法仅移除HTML标记,不会解析或处理嵌入在HTML中的JavaScript代码或其他非标记内容。此外,此方法也无法处理不规范或不符合预期格式的HTML标记。如果需要更复杂的HTML解析或清理,您可能需要使用专门的HTML解析库,如AngleSharp或HtmlAgilityPack等。

尽管上述方法对于许多简单场景已经足够有效,但在面对复杂的HTML文档时,由于HTML本身的嵌套和特殊结构,简单的正则表达式可能无法完美地解析并移除所有标签。在这种情况下,推荐使用专门为处理HTML设计的库,如HtmlAgilityPack,它可以准确地解析HTML并提供丰富的API用于提取纯文本内容。


在国内的新闻网站上,乱七八糟的广告和其他不相干内容太多。

怎么能批量提取出新闻标题和正文呢?

GeneralNewsExtractor(GNE)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容、标题、作者、发布时间、正文中的图片地址和正文所在的标签源代码。GNE在提取、网易新闻、游民星空、 观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻等数百个中文新闻网站上效果非常出色,几乎能够达到100%的准确率。借助GEN这个Python库,就可以很轻松的实现提取新闻内容的任务。

在ChatGPT中输入如下提示词:

写一段Python代码,实现提取新闻网站上文本的任务。具体步骤如下:

用户输入一个新闻页面的URL,获取URL;

用gne库(GeneralNewsExtractor)来提取标题和主体内容;

提取内容保存到d盘的excel文件中,excel文件标题为News,新闻标题标题放在第1列,新闻内容放在第2列;

程序运行后,显示错误信息:

403 Forbidden

You don't have permission to access the URL on this server.

denied by UA ACL = blacklist

Powered by Tengine CDN Request Id: a3b5179f16863107904525739e

求助于ChatGPT,回复如下:

看起来你遇到了403禁止访问的错误。这可能是因为目标网站的服务器拒绝了你的请求。这通常是因为服务器检测到了Python请求的User-Agent,认为这是一个爬虫或自动化工具。

你可以尝试在请求中伪装成一个常见的浏览器User-Agent,这样服务器可能就不会阻止你的请求了。以下是修改后的代码:

输入一篇网易新闻: https://www.163.com/news/article/I6QD90N400019K82.html

程序运行后,结果如下:

文本提取的准确度比较高,可以满足要求。

们今天来分析解释一下这个表达式string hrefPattern = @"href\s*=\s*(?:""'[""']|(?<1>[^>\s]+))";,并用实例演示用法。这个正则表达式用于从文本中提取href属性的值,这些值可以是被单引号或双引号包围的,或者是不包含大于符号和空白字符的文本。我们分解这个正则表达式来详细解释它的各个部分:

1. href\s*=\s*: 这部分匹配 href 关键字,后面可以跟着零个或多个空白字符,然后是一个等号,再然后又是零个或多个空白字符。其中href: 直接匹配文本中的"href",这是HTML中表示链接地址的属性名称。\s*=\s*: 匹配等号(=),等号前后可以有0个或多个空白字符(包括空格、制表符、换行符等)。

2. (?:...): 这是一个非捕获组,意味着它会匹配括号内的内容,但不会为其创建一个捕获组。这意味着我们不能直接从匹配结果中提取这部分内容。

3. [""'](?<1>[^""']*)[""']: 这部分匹配被单引号或双引号包围的任何内容。具体来说:

1. [""']: 匹配一个单引号或双引号。

2. (?<1>[^\"']*): 创建了一个命名捕获组,名为1,用来捕获在引号之间的任何非引号字符序列,这就是href属性的值。(?<1>...): 这是一个命名捕获组,但这里它被放在了一个非捕获组内,这意味着它不会捕获匹配的内容。

3. [^""']*: 匹配任何不是单引号或双引号的字符零次或多次。

4. [""']: 再次匹配一个单引号或双引号。

4. |: 或者操作符,表示前面的模式和后面的模式中的任何一个可以匹配。又叫管道符号,代表逻辑“或”操作,也就是表示前面的模式与后面的模式任一满足即可。

5. (?<1>[^>\s]+): 这部分匹配任何不是大于符号或空白字符的字符一次或多次。这也是一个命名捕获组,但同样,它被放在了一个非捕获组内。当href值没有被引号包围时使用。也就是这部分匹配不是大于符号(>)和空白字符的任何字符1次或多次,但不包括引号。

综上所述,此正则表达式能够处理以下两种格式的href属性及其值:

1. 被引号包围的情况:<a href="http://example.com">...</a> 或 <a href='http://example.com'>...</a>

2. 未被引号包围的情况:<a href=http://example.com>...</a>

实例演示用法:

using System.Text.RegularExpressions;

namespace ConsoleAppC

{

internal class Program

{

static void Main(string[] args)

{

string inputString = @"<a href=""http://example.com"">Link</a>

<a href='http://another.example.com'>Another Link</a>

<a href=http://noquotes.example.com>No Quotes Link</a>";

string hrefPattern = @"href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))";

MatchCollection matches = Regex.Matches(inputString, hrefPattern);

foreach (Match match in matches)

{

Console.WriteLine(match.Value); // 输出匹配到的href属性值

Console.WriteLine($"Found href value: {match.Groups[1].Value} at index: {match.Groups[1].Index}");

}

}

}

}


运行这段代码后,将输出如下结果:

href="http://example.com"

Found href value: http://example.com at index: 9

href='http://another.example.com'

Found href value: http://another.example.com at index: 72

href=http://noquotes.example.com

Found href value: http://noquotes.example.com at index: 150

为了给大家演示如何使用这个正则表达式,我们再看以下例子:

假设我们有以下的HTML片段:

<a href="https://www.example.com">Click here</a>

<a href='https://www.example.org'>Go there</a>

<a href="https://www.example.net" target="_blank">Open external link</a>

使用上述的正则表达式,我们可以提取所有的href属性值:

string input = @"<a href=\""https://www.example.com\"">Click here</a>

<a href='https://www.example.org'>Go there</a>

<a href=\""https://www.example.net\"" target=\""_blank\"">Open external link</a>";

代码为:

string hrefPattern = @"href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))";

Regex regex = new Regex(hrefPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);

MatchCollection matches = regex.Matches(input);

foreach (Match match in matches)

{

Console.WriteLine($"Found href: {match.Groups["1"].Value}");

}

string input = @"<a href=\""https://www.example.com\"">Click here</a>

输出将是:

Found href: \"https://www.example.com\"

Found href: https://www.example.org

Found href: \"https://www.example.net\"

注意,这个正则表达式并不完美,它可能无法处理所有可能的HTML格式,但对于简单的用途来说可能已经足够了。