当前位置:首页 > 前端开发 > 正文

如何用jsoup解析HTML标签?

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"); // 通过标签名

提取标签内容

获取标签的属性和文本:

如何用jsoup解析HTML标签? 第1张

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


关键特性

  1. 容错性强

    自动修复未闭合标签(如 <li> 未闭合)、错误嵌套结构(如 <div> 内嵌 <table>),确保解析稳定性。

    如何用jsoup解析HTML标签? 第2张

  2. CSS选择器支持

    支持类jQuery的选择器语法:

    doc.select("div.content > p:first-child"); // 定位直接子段落
  3. 白名单过滤(防XSS攻破)

    清理用户输入的HTML:

    String safeHtml = Jsoup.clean(rawHtml, Whitelist.basic());
  4. 文本格式化

    提取纯文本并保留可读格式:

    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(); // 网络异常处理 }


注意事项

  1. 异常处理

    网络请求需捕获 IOException,解析时注意 NullPointerException。

    如何用jsoup解析HTML标签? 第3张

  2. 性能优化

    • 复用 Document 对象避免重复解析。
    • 使用更精确的选择器(如避免 通配符)。
  3. 资源释放

    解析大型文件时,及时清理无用的 Document 和 Elements 对象。

  4. 适用场景

    • 网页爬虫数据提取
    • 模板引擎的HTML预处理
    • 用户输入内容的安全过滤
    • 渲染页面(jsoup不执行JavaScript/CSS)


    jsoup通过简洁的API实现了高效的HTML解析:

    1. 加载 → 2. 定位 → 3. 提取/修改 → 4. 输出结果

      结合其容错机制和选择器功能,可快速处理复杂HTML结构,是Java开发者处理Web数据的首选工具。

    引用说明 基于 jsoup官方文档 及最佳实践总结,示例代码遵循MIT许可证,安全过滤方案参考OWASP XSS防护指南。

0