整合营销服务商

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

免费咨询热线:

终于搞懂如何用Java去除HTML标签了

我平时的工作中,偶尔会用 Java 做一些解析HTML的工作。有的时候我需要删除所有的HTML标签,只保留纯文字内容。这个问题在做过一些爬虫工作的朋友来说很简单。下面来说说,我们平时使用到的集中解析的方法。

使用正则表达式

通过爬虫爬到的HTML内容,从程序角度来讲,就是一个字符串。我们可以对其按照纯文本处理的方式来处理。

我们在做文本处理的时候,第一个想到的就是正则表达式。从一个字符串中删除HTML,对于正则来说,还是比较简单的。毕竟还是有固定的格式,比如“<...>”。

我们常用的的正则就是 <[^>]> 或者 <.*?>

我们在使用正则的时候,需要注意的是正则默认是贪婪匹配。也就是说,正则表达式<.*> 能够匹配到更多的HTML内容,而不是单个标签。

现在,让我们测试一下它是否能从HTML源中删除标签。

正则测试删除标签1

在我们测试删除HTML标签之前,首先让我们创建一个HTML例子,例如example1.html

<!DOCTYPE html>
<html>
<head>
    <title>这是标题</title>
</head>
<body>
    <p>
        如果应用程序X没有启动,可能的原因是<br/>
        1. <a href="https://maven.apache.org">Maven</a>没有安装<br/>
        2. 磁盘空间不足<br/>
        3. 内存不足
    </p>
</body>
</html>

现在,让我们写一个测试,用String.replaceAll()来删除HTML标签。

String html = ... // load example1.html
String result = html.replaceAll("<[^>]`>", "");
System.out.println(result);

如果我们运行这个测试方法,我们会看到结果。

    这是标题



        如果应用程序X没有启动,可能的原因是
        1.Maven没有安装
        2.磁盘空间不足
        3.没有足够的内存

输出结果保留了剥离后的HTML的空白处。我们在处理提取的文本时,可以很容易地删除或跳过这些空行或空白处。

正则测试删除标签2

我们刚才已经看到了,通过使用Regex来删除HTML标签是非常简单。但是粗暴的使用这种方法会有很多问题,我们不能预测最终的结果会是怎么样的。

例如,一个HTML文档可能有<script><style>标签,而我们可能不希望在结果中出现它们的内容。

此外,<script><style>、甚至是<body>标签中的文本可能包含 <>字符。如果是这种情况,我们的正则方法可能会出错。

现在,让我们看看另一个例子,比如example2.html

<!DOCTYPE HTML>
<html>
<head>
    <title>这是标题</title>
</head>
<script>
    // some js function
</script>
<body>
    <p>
        如果应用程序X没有启动,可能的原因是<br/>
        1. <a
            id="link"
            href="http://maven.apache.org/">
            Maven
            </a> 没有安装<br/>
        2. 磁盘空间不足 (<1G) <br/>
        3. 内存不足(<64MB)<br/>
    </p>
</body>
</html>

现在我们有一个<script>标签和 <字符在<body>标签内。

如果我们对example2.html使用同样的方法,我们会得到如下内容。

   这是标题
    // some js function
        如果应用程序X没有启动,可能的原因是
        1. 
            Maven
             没有安装
        2. 磁盘空间不足 (
        3. 内存不足(

显然,由于"<"字符的存在,我们丢失了一些文本。所以正则在处理文本的时候并不是万能的。我们可以使用一些 HTML 解析器来做这些比较复杂的场景。

使用Jsoup

Jsoup 是一个流行的HTML解析库,如果想要从一个HTML文档中提取文本,我们可以简单地调用Jsoup.parse(htmlString).text()

在项目中使用的时候,我们首先需要添加 jsoup 的依赖库,我们这里就通过maven的方式引入。

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
</dependency>

我们用 example2.html来测试一下。

String html = ... // load example2.html
System.out.println(Jsoup.parse(html).text());

如果我们让这个方法运行,它就会打印出来。

这是标题 如果应用程序X没有启动,可能的原因是 1.Maven没有安装 2.没有足够的(<1G)磁盘空间 3.没有足够的(<64MB)内存

从输出结果可知,Jsoup已经成功地从HTML文档中提取了文本。另外,<script>元素中的文本已经被忽略了。

此外,默认情况下,Jsoup会删除所有的文本格式和空白处,比如换行符。

使用HTMLCleaner

HTMLCleaner 也是一个HTML解析库。

首先,我们需要在pom.xml中添加HTMLCleaner 依赖。

<dependency>
    <groupId>net.sourceforge.htmlcleaner</groupId>
    <artifactId>htmlcleaner</artifactId>
    <version>2.25</version>
</dependency>

我们可以设置[各种参数](http://htmlcleaner.sourceforge.net/parameters.php)来控制HTMLCleaner的解析行为。我们在这里使用HTMLCleaner在解析example2.html时跳过<script>元素。

String html = ... // load example2.html
CleanerProperties props = new CleanerProperties();
props.setPruneTags("script");
String result = new HtmlCleaner(props).clean(html).getText().toString();
System.out.println(result);

运行一下,HTMLCleaner将产生这样的输出。

这是标题



        如果应用程序X没有启动,可能的原因是:
        1.Maven没有安装
        2.没有足够的(<1G)磁盘空间
        3.内存不足(<64MB)

我们可以看到,<script>元素中的内容被忽略了, <br/>标签转换为提取的文本中的换行符。另外, HTMLCleaner 保留了HTML的空白内容。

总结

在这篇文章中,我们学习了几种去除HTML的方法,我们需要注意的是,正则在文本处理的过程中并不是万能的。

HP默认的函数有移除指定html标签,名称为strip_tags,在某些场合非常有用。

strip_tags

(PHP 3 >= 3.0.8, PHP 4, PHP 5)

strip_tags — Strip HTML and PHP tags from a string

string strip_tags ( string str [, string allowable_tags] )

弊端 :

这个函数只能保留想要的html标签,就是参数string allowable_tags。

这个函数的参数allowable_tags的其他的用法。

strip_tags($source, ”); 去掉所以的html标签。

strip_tags($source, ‘<div><img><em>’); 保留字符串中的div、img、em标签。

如果想去掉的html的指定标签。那么这个函数就不能满足需求了。于是乎我用到了这个函数。

/**

* Removes specific tags.

*/

function strip_only_tags($str, $tags, $stripContent = FALSE) {

$content = '';

if (!is_array($tags)) {

$tags = (strpos($str, '>') !== false ? explode('>', str_replace('<', '', $tags)) : array($tags));

if (end($tags) == '') {

array_pop($tags);

}

}

foreach($tags as $tag) {

if ($stripContent) {

$content = '(.+<!--'.$tag.'(-->|\s[^>]*>)|)';

}

$str = preg_replace('#<!--?'.$tag.'(-->|\s[^>]*>)'.$content.'#is', '', $str);

}

return $str;

}

参数说明

$str — 是指需要过滤的一段字符串,比如div、p、em、img等html标签。

$tags — 是指想要移除指定的html标签,比如a、img、p等。

$stripContent = FALSE — 移除标签内的内容,比如将整个链接删除等,默认为False,即不删除标签内的内容。

使用说明

$target = strip_only_tags($source, array(‘a’,'em’,'b’));

移除$source字符串内的a、em、b标签。

$source='<div><a href="http://www.tsingyaun.cn" target="_blank"><img src="http://www.tsingyuan.cn/logo.png" border="0" alt="Welcome to linzl." />This a example from<em>lixiphp</em></a><strong>!</strong></div>

';

$target = strip_only_tags($source, array('a','em'));

//target results

//<div><img src="http://blog.lixiphp.com/logo.png" border="0" alt="Welcome to lixiphp." />This a example from<strong>!</strong></div>

:left;"

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用于提取纯文本内容。