上一篇                     
               
			  如何用jsoup解析HTML标签?
- 前端开发
- 2025-06-29
- 4346
 jsoup通过加载HTML字符串、文件或URL创建Document对象,使用DOM遍历或CSS选择器定位元素,支持属性提取、文本获取和节点操作,实现高效HTML解析。
 
什么是jsoup?
jsoup 是一款用于解析、提取和操作HTML文档的Java库,它专为处理真实世界的HTML设计(如处理不闭合标签、错误嵌套等),提供类似jQuery的DOM操作API,广泛应用于网页抓取、数据清洗和HTML解析任务。
核心解析步骤
加载HTML文档
jsoup支持多种HTML加载方式:
// 从URL加载(需处理异常)
Document doc = Jsoup.connect("https://example.com").get();
// 从字符串加载
String html = "<div><p>Hello, jsoup!</p></div>";
Document doc = Jsoup.parse(html);
// 从本地文件加载
File file = new File("page.html");
Document doc = Jsoup.parse(file, "UTF-8"); 
定位HTML标签
通过选择器语法或DOM方法定位元素:
// 使用CSS选择器(推荐)
Elements links = doc.select("a[href]");      // 所有带href的<a>标签
Elements headers = doc.select("h1, h2, h3"); // 所有标题标签
// 使用DOM方法
Element firstDiv = doc.getElementById("main"); // 通过ID
Elements paragraphs = doc.getElementsByTag("p"); // 通过标签名 
提取标签内容
获取标签的属性和文本:
for (Element link : links) {
    String href = link.attr("href");     // 提取href属性
    String text = link.text();           // 提取可见文本(不含HTML标签)
    String htmlContent = link.html();    // 提取内部HTML
    String outerHtml = link.outerHtml(); // 提取完整HTML(包含自身标签)
} 
修改HTML结构
动态操作DOM树:

// 修改属性
link.attr("rel", "nofollow");
// 添加/移除类
div.addClass("highlight");
div.removeClass("old-class");
paragraph.text("新文本内容");  // 转义特殊字符
paragraph.html("<b>加粗文本</b>"); // 插入HTML
// 删除元素
div.remove(); 
处理嵌套标签
遍历子元素或父元素:
// 遍历直接子元素
for (Element child : div.children()) {
    System.out.println(child.tagName());
}
// 查找父元素
Element parent = link.parent();
// 查找特定祖先
Element ancestor = link.closest("div.container"); 
关键特性
-  容错性强 
 自动修复未闭合标签(如<li>未闭合)、错误嵌套结构(如<div>内嵌<table>),确保解析稳定性。
-  CSS选择器支持 
 支持类jQuery的选择器语法:doc.select("div.content > p:first-child"); // 定位直接子段落
-  白名单过滤(防XSS攻击) 
 清理用户输入的HTML: String safeHtml = Jsoup.clean(rawHtml, Whitelist.basic()); 
-  文本格式化 
 提取纯文本并保留可读格式:String plainText = doc.text(); // 获取整个文档的纯文本 
完整示例:抓取并解析网页
try {
    // 抓取网页并解析
    Document doc = Jsoup.connect("https://news.example.com")
                        .timeout(5000) // 超时设置
                        .get();
    // 提取所有新闻标题(<h2 class="title">)
    Elements titles = doc.select("h2.title");
    for (Element title : titles) {
        System.out.println("标题: " + title.text());
        System.out.println("父容器ID: " + title.parent().id());
    }
    // 修改第一个标题s.first().html("<em>最新头条</em>");
    // 输出修改后的HTML
    System.out.println(doc.html());
} catch (IOException e) {
    e.printStackTrace(); // 网络异常处理
} 
注意事项
-  异常处理 
 网络请求需捕获IOException,解析时注意NullPointerException。
-  性能优化 - 复用 Document对象避免重复解析。
- 使用更精确的选择器(如避免 通配符)。
 
- 复用 
-  资源释放 
 解析大型文件时,及时清理无用的Document和Elements对象。 
适用场景
- 网页爬虫数据提取
- 模板引擎的HTML预处理
- 用户输入内容的安全过滤
- 渲染页面(jsoup不执行JavaScript/CSS)
jsoup通过简洁的API实现了高效的HTML解析:
- 加载 → 2. 定位 → 3. 提取/修改 → 4. 输出结果
 结合其容错机制和选择器功能,可快速处理复杂HTML结构,是Java开发者处理Web数据的首选工具。
引用说明 基于 jsoup官方文档 及最佳实践总结,示例代码遵循MIT许可证,安全过滤方案参考OWASP XSS防护指南。
 
  
			 
			 
			 
			 
			 
			 
			