• 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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"
                  + "

    解析方法.

    "
    ; Document document = Jsoup.parse(html);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 处理HTML文本,去除特殊字符、html标签等
    //1. clean方法
    String content = Jsoup.clean("
    \n" + " 百科\n" + "
    "
    , Whitelist.none()); log.info("clean结果:" + content); //2. parse方法后通过text获取内容 String text = Jsoup.parse("
    \n" + " 百科\n" + "
    "
    ).text(); log.info("parse-text结果:" + text); //以上结果都是“百科”
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 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());
    //结果:内的所有内容
    //3. 添加一个元素
    Element element = doc.createElement("@@@");
    //结果:<@@@>
    //4. 复制doc
    Document clone = doc.clone();
    //结果:整个html文档拷贝
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 操作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"));
    //结果:
    //2. 根据class获取元素
    System.out.println("根据class获取元素结果:" + doc.getElementsByClass("nav-link"));
    //结果:学习
    //教程...
    //3. 根据tag获取元素
    System.out.println("根据tag获取元素结果:" + doc.getElementsByTag("img"));
    //结果:
    //稀土掘金技术社区
    //Component Tree...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 使用选择器语法查找元素
     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);
     //结果:
     //在这里...
     //2. 扩展名为.png的图片
     Elements png = doc.select("img[src$=.png]");
     System.out.println("扩展名为.png图片的结果:" + png);
     //结果:Component Tree
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    总结

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

  • 相关阅读:
    十二、CANdelaStudio入门-Security
    2.6 - 进程资源
    安化云台山风景区,两代人的守望与坚持
    杰理之解码的实时性【篇】
    智安网络|提升企业网络安全:避免成为勒索软件攻击的目标
    代码Bug太多?给新人Code Review头都大了?快来试试SpotBugs
    Java的abstract应用和代理模式应用
    《昇思25天学习打卡营第23天|ResNet50迁移学习》
    LinkedList相较于Arravlist的特点/优化(面试笔记总结速记)
    不标准的 json 格式的字符串如何转为标准的(json字符串属性名不带双引号如何转
  • 原文地址:https://blog.csdn.net/u013034223/article/details/127988329