Skip to content

HTML解析器(Jsoup)

概述

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据,可操作 HTML 元素、属性、文本。

适用范围

Pangea v2.0.1.3+

快速上手

在业务模块的pom文件中添加依赖:

html
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>${jsoup.version}</version>
</dependency>

注意

目前框架支持的Fastjson的版本为1.11.3,已经集成到框架中,不需要额外引用。

常用功能

###文档输入 jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成 Document 对象实例。

html
// 直接从字符串中输入 HTML 文档
 String html = "<html><head><title> 开源中国社区 </title></head>"
  + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>";
 Document doc = Jsoup.parse(html);

 // 从 URL 直接加载 HTML 文档
 Document doc = Jsoup.connect("http://www.oschina.net/").get();
 String title = doc.title();

 Document doc = Jsoup.connect("http://www.oschina.net/")
  .data("query", "Java")   // 请求参数
  .userAgent("I ' m jsoup") // 设置 User-Agent
  .cookie("auth", "token") // 设置 cookie
  .timeout(3000)           // 设置连接超时时间
  .post();                 // 使用 POST 方法访问 URL

 // 从文件中加载 HTML 文档
 File input = new File("D:/test.html");
 Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");

###解析并提取 HTML 元素

html
 File input = new File("D:/test.html");
 Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");

 Element content = doc.getElementById("content");
 Elements links = content.getElementsByTag("a");
 for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
 }

jsoup 使用跟 jQuery 一模一样的选择器对元素进行检索,以上的检索方法如果换成是其他的 HTML 解释器,至少都需要很多行代码,而 jsoup 只需要一行代码即可完成。

html
 File input = new File("D:\test.html");
 Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");

 Elements links = doc.select("a[href]"); // 具有 href 属性的链接
 Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素

 Element masthead = doc.select("div.masthead").first();
 // 找出定义了 class=masthead 的元素

 Elements resultLinks = doc.select("h3.r > a"); // direct a after h3

###修改数据 在解析文档的同时,我们可能会需要对文档中的某些元素进行修改,例如我们可以为文档中的所有图片增加可点击链接、修改链接地址或者是修改文本等,修改完直接调用 Element(s) 的 html() 方法就可以获取修改完的 HTML 文档。

html
 doc.select("div.comments a").attr("rel", "nofollow");
 // 为所有链接增加 rel=nofollow 属性
 doc.select("div.comments a").addClass("mylinkclass");
 // 为所有链接增加 class=mylinkclass 属性
 doc.select("img").removeAttr("onclick"); // 删除所有图片的 onclick 属性
 doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本

###HTML 文档清理 jsoup 在提供强大的 API 同时,人性化方面也做得非常好。在做网站的时候,经常会提供用户评论的功能。有些用户比较淘气,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,例如 XSS 跨站点攻击之类的。 jsoup 对这方面的支持非常强大,使用非常简单。

html
 String unsafe = "<p><a href='http://www.oschina.net/' onclick='stealCookies()'>
 开源中国社区 </a></p>";
 String safe = Jsoup.clean(unsafe, Whitelist.basic());
 // 输出 :
 // <p><a href="http://www.oschina.net/" rel="nofollow"> 开源中国社区 </a></p>

参考文档

1、Jsoup 使用指南