Jsoup 是一个强大的 Java HTML 解析库,专为处理真实世界的 HTML 而设计,它提供了一套简洁的 API,支持 DOM 遍历、CSS 选择器操作以及数据提取,是爬虫开发、数据清洗和网页分析的理想工具,以下是详细解析流程:
核心功能解析
-
HTML 清洗与规范化
Jsoup 会自动将输入的 HTML 转换为符合标准的 DOM 结构,修复未闭合标签、嵌套错误等问题:String html = "<div><p>破碎的HTML"; Document doc = Jsoup.parse(html); System.out.println(doc.html()); // 输出: <html><head></head><body><div><p>破碎的HTML</p></div></body></html>
-
数据来源解析
支持多种输入源:- 字符串解析
Document doc = Jsoup.parse(htmlString);
- URL 直接抓取(需处理异常)
Document doc = Jsoup.connect("https://example.com") .timeout(5000) // 超时设置 .get();
- 本地文件解析
Document doc = Jsoup.parse(new File("page.html"), "UTF-8");
- 字符串解析
DOM 遍历与数据提取
-
使用 CSS 选择器
类 jQuery 语法精准定位元素:Elements links = doc.select("a[href]"); // 所有带链接的<a>标签 for (Element link : links) { String url = link.attr("href"); // 获取属性 String text = link.text(); // 获取可见文本 }
-
DOM 树遍历
通过父子节点关系操作:Element body = doc.body(); Element firstDiv = body.child(0); // 获取第一个子元素 Element parent = firstDiv.parent(); // 获取父元素
高级数据操作技巧
-
处理
- 获取完整 HTML:
element.html()
- 获取纯文本:
element.text()
- 修改属性:
element.attr("class", "newClass")
- 获取完整 HTML:
-
相对路径转绝对路径
自动转换链接为绝对路径:String absUrl = link.attr("abs:href"); // 输出 http://example.com/page
-
HTML 片段处理
解析部分内容:Element footer = Jsoup.parseBodyFragment("<div>Footer</div>").body();
安全与防御
- XSS 防护
使用Jsoup.clean()
过滤危险标签:String safeHtml = Jsoup.clean(rawHtml, Safelist.basic() // 白名单规则 );
支持自定义白名单(如允许特定标签和属性)。
实战示例:爬取新闻标题
Document doc = Jsoup.connect("https://news.example.com").get(); Elements news = doc.select(".news-title"); // 根据CSS类选择 for (Element title : news) { System.out.println("标题: " + title.text()); System.out.println("链接: " + title.attr("abs:href")); }
性能优化建议
- 复用
Connection
对象减少连接开销 - 使用
select
替代递归遍历提升效率 - 设置合理超时:
.timeout(3000)
- 关闭响应避免资源泄漏(通过 try-with-resources)
常见问题排查
- 乱码问题:在
parse()
中指定字符集,如Jsoup.parse(html, "UTF-8")
- 连接拒绝:检查网络或设置 User-Agent:
.header("User-Agent", "Mozilla/5.0")
- 元素遗漏:确认页面是否通过 JavaScript 动态加载(Jsoup 不执行 JS)
为什么选择 Jsoup?
- 精准的 CSS 选择器:语法与浏览器一致
- 容错性强:自动修复混乱的 HTML 结构
- 零依赖:仅需单一 JAR 文件(官网下载)
- 持续维护:GitHub 活跃社区与及时更新
引用说明参考 Jsoup 官方文档(jsoup.org)及 HTML 解析标准,代码示例基于 Jsoup 1.16.1 验证,适用于 Java 8+ 环境,实践时请遵守目标网站的 robots.txt 协议及法律法规。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/41736.html