JSOUP 使用教程
1. 什么是 Jsoup?
Jsoup 是一个用于解析和操作 HTML 文档的 Java 库。它可以帮助你:
- 提取网页中的特定信息(如标题、段落、链接等)。
- 修改 HTML 内容(添加、删除或修改节点)。
- 将 HTML 文档保存为字符串或文件。
Jsoup 的核心功能是解析 HTML 并提供类似 CSS 选择器的 API,方便用户快速定位和操作 DOM 元素。
2. 安装 Jsoup
在项目中使用 Jsoup,可以通过以下方式添加依赖:
Maven 方式
在 pom.xml
文件中添加:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.4</version>
</dependency>
手动引入 JAR 包
从 Jsoup 官网 下载最新版本的 JAR 文件,将其添加到项目依赖中。
3. 基本用法
3.1 解析 HTML 文档
Jsoup 可以解析本地文件、字符串或通过网络获取的 HTML 内容。
从文件加载
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupExample {
public static void main(String[] args) throws Exception {
// 从本地 HTML 文件加载文档
Document doc = Jsoup.load("example.html");
System.out.println(doc.title()); // 输出标题
}
}
从字符串解析
String htmlContent = "<html><head><title>Test</title></head><body><h1>Hello World</h1></body></html>";
Document doc = Jsoup.parse(htmlContent);
System.out.println(doc.title()); // 输出 "Test"
从 URL 加载
// 通过网络加载 HTML 内容
Document doc = Jsoup.connect("https://example.com").get();
System.out.println(doc.title());
3.2 设置超时时间
在从网络加载内容时,可以设置超时时间以避免程序长时间无响应:
Document doc = Jsoup.connect("https://example.com")
.timeout(5000) // 5秒超时
.get();
4. 查找和选择节点
Jsoup 提供了强大的节点选择功能,支持 CSS 选择器。
4.1 常用选择方法
select(String selector)
:根据 CSS 选择器查找所有匹配的元素。getElementById(String id)
:通过 ID 查找单个元素。getElementsByTag(String tag)
:通过标签名查找所有元素。getElementsByClass(String className)
:通过类名查找所有元素。
4.2 示例
Document doc = Jsoup.connect("https://example.com").get();
// 1. 查找所有的 <a> 链接
Elements links = doc.select("a");
for (Element link : links) {
System.out.println(link.attr("href")); // 输出链接地址
}
// 2. 查找所有段落(<p> 标签)
Elements paragraphs = doc.select("p");
for (Element p : paragraphs) {
System.out.println(p.text()); // 输出段落文本
}
// 3. 查找特定类名的元素
Elements divs = doc.getElementsByClass("container");
System.out.println(divs.size());
5. 提取和修改数据
5.1 提取文本
Element element = doc.selectFirst(".content"); // 获取第一个 .content 类的元素
String text = element.text(); // 提取纯文本
System.out.println(text);
5.2 提取属性值
// 查找所有 <img> 标签并提取 src 属性
Elements imgs = doc.select("img");
for (Element img : imgs) {
String src = img.attr("src"); // 获取 src 属性值
System.out.println(src);
}
5.3 修改节点
// 1. 添加新内容
Element body = doc.body();
body.append("<p>This is a new paragraph.</p>");
// 2. 删除元素
Elements scripts = doc.select("script");
scripts.remove(); // 删除所有 <script> 标签
// 3. 替换文本
doc.selectFirst("#title").text("New Title"); // 修改 ID 为 title 的元素的文本
6. 处理表单和链接
6.1 提取表单数据
// 查找所有 <form> 表单
Elements forms = doc.select("form");
for (Element form : forms) {
String action = form.attr("action"); // 获取表单的 action 属性
String method = form.attr("method"); // 获取表单的 method 属性
System.out.println("Form action: " + action);
}
6.2 提取链接
// 查找所有 <a> 链接
Elements links = doc.select("a[href]");
for (Element link : links) {
String href = link.attr("abs:href"); // 获取完整的 URL 地址(包括域名)
System.out.println(href);
}
7. 保存文档
7.1 将文档保存为字符串
String htmlContent = doc.outerHtml(); // 转换为 HTML 字符串
System.out.println(htmlContent);
7.2 将文档保存为文件
// 保存修改后的文档到本地文件
File outputFile = new File("output.html");
doc.outputSettings(new Document.OutputSettings().prettyPrint(false)); // 禁止自动格式化
Files.write(outputFile, doc.outerHtml(), StandardCharsets.UTF_8);
8. 注意事项
-
编码问题:
- 在处理网络请求时,建议指定编码方式:
Document doc = Jsoup.connect("https://example.com") .charset("UTF-8") // 设置字符编码 .get();
- 在处理网络请求时,建议指定编码方式:
-
避免被反爬虫机制拦截:
- 可以设置请求头(如 User-Agent)来模拟浏览器访问:
Document doc = Jsoup.connect("https://example.com") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") .get();
- 可以设置请求头(如 User-Agent)来模拟浏览器访问:
-
处理动态内容:
- Jsoup 无法直接处理 JavaScript 加载的内容,此时可以考虑使用工具(如 Selenium)来获取完整的页面内容。
9. 总结
- 优势:API 简单易用,支持 CSS 选择器,适合快速解析和操作 HTML。
- 适用场景:网页抓取、数据提取、简单页面生成等。
- 不足:无法处理动态 JavaScript 内容,对某些复杂页面可能需要额外处理。
希望这篇教程对你有所帮助!如果还有其他问题,欢迎在评论区留言交流。