引言

对于一段HTML文本,需要去掉文本内所有HTML标签,只保留纯文本内容,可以怎么实现?看到很多写正则表达式,用StringUtils里的replace方法实现的。我自己也尝试了一下,发现正则匹配的结果并不是完全可靠的。由此,本篇博客将介绍一个Java库,可以实现对HTML文本的各种操作,简单好用。

简要介绍

jsoup是一款Java的HTML解析器,可以直接解析某个URL地址或HTML内容。它提供了一套非常简单好用的API,可通过DOM,CSS以及类似于jQuery的操作方法来读取和操作数据。

官网地址

jsoup是一个根据自由MIT许可证分发的开源项目,源代码可在GitHub获得。

源码地址

核心类及方法

1. org.jsoup.Jsoup类

Jsoup类是任何Jsoup程序的入口点,并将提供从各种来源加载和解析HTML文档的方法。核心方法如下:

  • Connection connect(String url):创建并返回URL的连接
  • Document parse(File in,String charsetName):将指定的字符集文件解析成文档
  • Document parse(String html):将给定的html代码解析成文档
  • String clean(String bodyHtml,Whitelist whitelist):从输入HTML返回安全的HTML,通过解析输入HTML并通过允许的标签和属性的白名单进行过滤。

2. org.jsoup.nodes.Document类

该类表示通过Jsoup库加载HTML文档。可以使用此类执行适用于整个HTML文档的操作。下面列举一些核心方法:

  • Element body():获取文档中body或frameset元素内容,如果文档中没有body元素,返回的文本中会加上该元素
  • String title():获取文档中title元素内容,如果没有则返回空
  • Element normalise():返回完整的文档,会自动补充文档的html、head、body元素
  • Document clone():创建一个新文档,将拷贝所有节点及子节点

3. org.jsoup.nodes.Element类

HTML元素是由标签名称,属性和子节点组成。 使用Element类,可以帮助我们提取数据,遍历节点和操作HTML。

  • Elements getAllElements():获取所有元素,包括自身及所有子元素
  • Element getElementById(String id):通过id查询元素,包括其下层元素
  • Elements getElementsByTag(String tagName):获取特定标签下所有元素,包括其下层元素
  • Elements getElementsByAttribute(String key):获取指定属性下所有元素
  • Elements getElementsByClass(String className):获取指定class下所有元素,包括其下层元素

使用方法与示例

1. Maven依赖

使用jsoup,只需要引入一个依赖即可

<dependency>
  <!-- jsoup HTML parser library @ http://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.15.3</version>
</dependency>

2. 使用示例

  • 加载HTML文档
//1.从URL地址加载html
//方法一:connection连接URL
Document doc = Jsoup.connect("https://www.baidu.com/").get();
//方法二:parse解析URL
Document document = Jsoup.parse(new URL("https://www.baidu.com/"), 30000);

//2.加载html文件
Document document = Jsoup.parse( new File( "D:/temp/index.html" ) , "utf-8" );

//3. 直接解析html文本
String html = "<html><head><title>解析HTML</title></head>"
              + "<body><p>解析方法.</p></body></html>";
Document document = Jsoup.parse(html);
  • 处理HTML文本,去除特殊字符、html标签等
//1. clean方法
String content = Jsoup.clean("<div class=\"s-top-more-title c-font-normal c-color-t\">\n" +
                "       百科\n" +
                "      </div>", Whitelist.none());
log.info("clean结果:" + content);
//2. parse方法后通过text获取内容
String text = Jsoup.parse("<div class=\"s-top-more-title c-font-normal c-color-t\">\n" +
                "       百科\n" +
                "      </div>").text();
log.info("parse-text结果:" + text);
//以上结果都是“百科”
  • Document获取title、body、添加元素、复制
Document doc = Jsoup.connect("https://v2.cn.vuejs.org/v2/guide/").get();
//1. 获取title
System.out.println("title结果:" + doc.title());
//结果:介绍 — Vue.js
//2. 获取body
System.out.println("body结果:" + doc.body());
//结果:<body></body>内的所有内容
//3. 添加一个元素
Element element = doc.createElement("@@@");
//结果:<@@@></@@@>
//4. 复制doc
Document clone = doc.clone();
//结果:整个html文档拷贝
  • 操作DOM,根据id、class、tag等获取元素,与js调用方法相同
Document doc = Jsoup.connect("https://v2.cn.vuejs.org/v2/guide/").get();
//1. 根据id获取元素
System.out.println("根据id获取元素结果:" + doc.getElementById("search-query-nav"));
//结果:<input type="text" id="search-query-nav" class="search-query st-default-search-input" aria-label="搜索">
//2. 根据class获取元素
System.out.println("根据class获取元素结果:" + doc.getElementsByClass("nav-link"));
//结果:<a class="nav-link current">学习</a>
//<a href="/v2/guide/" class="nav-link current">教程</a>...
//3. 根据tag获取元素
System.out.println("根据tag获取元素结果:" + doc.getElementsByTag("img"));
//结果:
//<img id="s-稀土掘金技术社区" alt="稀土掘金技术社区">
//<img src="/images/components.png" alt="Component Tree">...
  • 使用选择器语法查找元素
Document doc = Jsoup.connect("https://v2.cn.vuejs.org/v2/guide/").get();
 //1. 带有href属性的a元素
 Elements links = doc.select("a[href]");
 System.out.println("带href属性的a元素结果:" + links);
 //结果:<a class="logo" href="/"></a>
 //<a target="_blank" rel="noopener" href="https://v3.cn.vuejs.org/">在这里</a>...
 //2. 扩展名为.png的图片
 Elements png = doc.select("img[src$=.png]");
 System.out.println("扩展名为.png图片的结果:" + png);
 //结果:<img src="/images/components.png" alt="Component Tree">

总结

这个工具,让服务端也能很容易地处理HTML文本了。除了自己用到的一些方法,通过本篇博客的总结,也发现了其更多方法,以后查API文档应该就足够用了。