Java中的HTML解析:库概述与实践示例
HTML解析(从网页中提取数据)是现代开发中的关键任务之一。Java为此提供了强大的工具。在本文中,我们将介绍三个流行的库:Jsoup、HtmlUnit和Apache Tika。您将了解如何安装它们、它们解决哪些问题,并看到可运行的代码示例。
为什么需要HTML解析?
HTML解析用于:
- 从网站收集数据(价格、新闻、联系方式)。
- 测试Web应用程序(提取界面元素)。
- 自动化日常操作(填写表单、检查链接)。
- 分析网站的SEO结构。
1. Jsoup — 最流行的Java HTML解析器
Jsoup是一个轻量级、直观易用的HTML处理库。它可以加载页面、解析页面、使用CSS选择器和类似jQuery的方法提取数据。Jsoup会自动修复不正确的标记,使其成为解析真实网站的理想选择。
安装(Maven)
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.17.2</version></dependency>示例:提取所有新闻标题
假设我们需要从新闻门户获取所有文章标题。使用CSS选择器h2.news-title。
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");
// 输出每个标题的文本 for (var title : titles) { System.out.println(title.text()); } }}Jsoup的特点:
- 无需浏览器,仅通过HTTP请求工作。
- 支持CSS选择器(类似jQuery)。
- 可以操作DOM(添加、删除元素)。
- 不支持执行JavaScript。
2. HtmlUnit — 支持JavaScript的解析
HtmlUnit是一个Java浏览器模拟器。它不仅仅是解析HTML,而是完全处理页面:执行JavaScript、加载CSS、处理AJAX请求。非常适合现代SPA网站(React、Angular)。
安装(Maven)
<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.70.0</version></dependency>示例:在JavaScript加载后获取数据
假设页面上有一个动态块,在加载后2秒出现。HtmlUnit会等待它。
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()) { // 禁用CSS和日志记录以提高速度 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(true);
// 加载页面 HtmlPage page = webClient.getPage("https://example.com/dynamic");