Jsoup,一款超好用的HTML文本解析Java工具
Posted 好好生活_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsoup,一款超好用的HTML文本解析Java工具相关的知识,希望对你有一定的参考价值。
引言
对于一段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文档应该就足够用了。
以上是关于Jsoup,一款超好用的HTML文本解析Java工具的主要内容,如果未能解决你的问题,请参考以下文章