Java HTML解析:库与工具概览
HTML解析是从HTML文档中提取结构化数据的过程。在Java中,有多个强大的库可以完成此任务,不仅能解析静态页面,还能处理动态内容。本文将介绍三种最流行的工具:Jsoup、HtmlUnit和Jericho HTML解析器。它们各有特点和适用场景。
1. Jsoup — 通用HTML解析器
Jsoup是最流行的Java HTML处理库。它提供了便捷的API用于加载、解析和提取数据,并支持CSS选择器和DOM树操作。Jsoup非常适合静态页面和简单的网页抓取任务。
主要功能:
- 从URL、文件或字符串加载HTML
- 使用CSS选择器提取数据
- 清理HTML中不需要的标签
- 修改DOM(添加/删除元素)
- 自动修正不规范的HTML
代码示例:提取新闻标题
import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.select.Elements;
public class JsoupExample { public static void main(String[] args) throws Exception { // 加载HTML页面 Document doc = Jsoup.connect("https://example.com/news") .userAgent("Mozilla/5.0") .timeout(5000) .get(); // 提取所有class为"news-title"的h2标题 Elements titles = doc.select("h2.news-title"); // 输出每个标题的文本 titles.forEach(title -> System.out.println(title.text())); }}2. HtmlUnit — 支持JavaScript的解析器
HtmlUnit是一个基于Java的无头浏览器,模拟真实浏览器行为。与Jsoup不同,它能执行JavaScript代码、处理AJAX请求并支持Cookie。这是解析现代SPA应用和动态内容网站不可或缺的工具。
关键特性:
- 完全模拟浏览器(Chrome、Firefox、IE)
- 执行JavaScript(包括jQuery和React)
- 支持表单、点击、页面导航
- 处理Cookie、会话和重定向
- 内置XPath和CSS选择器支持
代码示例:等待动态内容加载
import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.HtmlPage;import com.gargoylesoftware.htmlunit.html.HtmlElement;
public class HtmlUnitExample { public static void main(String[] args) throws Exception { try (WebClient webClient = new WebClient()) { // 关闭日志和超时 webClient.getOptions().setThrowExceptionOnScriptError(false); webClient.getOptions().setJavaScriptEnabled(true); // 加载页面 HtmlPage page = webClient.getPage("https://example.com/dynamic"); // 等待2秒以执行JS webClient.waitForBackgroundJavaScript(2000); // 通过XPath提取数据 HtmlElement element = page.getFirstByXPath("//div[@class='result']/p"); System.out.println("结果: " + element.getTextContent()); } }}3. Jericho HTML解析器 — 轻量快速
Jericho HTML解析器是一个轻量级库,依赖极少。它擅长解析无效HTML,并提供对文档结构的底层访问。