Java中的HTML解析:最佳库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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");

推荐