我们在做文本处理的时候,第一个想到的便是正则表达式。从一个字符串中删除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.htmlString 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 解析器来做这些比较繁芜的场景。
利用JsoupJsoup 是一个盛行的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.htmlSystem.out.println(Jsoup.parse(html).text());
如果我们让这个方法运行,它就会打印出来。
这是标题 如果运用程序X没有启动,可能的缘故原由是 1.Maven没有安装 2.没有足够的(<1G)磁盘空间 3.没有足够的(<64MB)内存
从输出结果可知,Jsoup已经成功地从HTML文档中提取了文本。其余,<script>元素中的文本已经被忽略了。
此外,默认情形下,Jsoup会删除所有的文本格式和空缺处,比如换行符。
利用HTMLCleanerHTMLCleaner 也是一个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.htmlCleanerProperties 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的方法,我们须要把稳的是,正则在文本处理的过程中并不是万能的。