Jsoup.parse() 默认按HTML5模式解析,自动补全结构,片段内容需通过doc.body().children()遍历;传入字符串需注意编码匹配,空值会抛异常;远程加载需设置User-Agent、超时等参数;读取文件要注意路径基准和真实编码;解析后应验证outerHtml长度、title及body存在性。

Jsoup.parse() 怎么解析 HTML 字符串
直接用 Jsoup.parse() 就能从字符串生成 Document,但必须注意:它默认按「HTML5 模式」解析,会自动补全缺失的 <html>、<body> 等结构。如果你传入的是纯片段(比如一段 <p>Hello</p><div>World</div>),它也能工作,但节点层级可能和预期不同。
- 传入不完整 HTML 片段时,
doc.body().children()才是你真正想遍历的内容,别直接doc.children()—— 那里可能包着<head>和自动生成的<body> - 如果字符串含中文或特殊符号,且没指定编码,
parse(String)会按 UTF-8 解码;若源内容实际是 GBK,就会乱码,此时应改用Jsoup.parse(html, "UTF-8")或先转码 - 空字符串或
null传给parse()会抛IllegalArgumentException,务必提前判空
Jsoup.connect() 加载远程 URL 为什么常失败
不是代码写错,而是默认行为太“干净”:它不带 User-Agent、不接受重定向、超时仅 3 秒、遇到 4xx/5xx 直接抛 HttpStatusException。绝大多数网站会拦截无头请求。
- 必加请求头:
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") - 允许重定向(如跳登录页):
.followRedirects(true) - 设合理超时:
.timeout(10000)(单位毫秒) - 忽略 HTTP 错误状态码(比如返回 403 但页面仍有数据):
.ignoreHttpErrors(true) - 需要登录态?用
.cookie("SESSIONID", "xxx")或.cookies(Map)注入
读取本地 HTML 文件要注意什么编码和路径
Jsoup.parse(File, String charsetName) 是安全的选择,但两个坑很隐蔽:
- 文件路径用相对路径时,基准是 JVM 启动目录,不是项目根目录,也不是
src/main/resources;推荐用getClass().getResource("/page.html").getFile()获取绝对路径 - charsetName 必须和文件真实编码严格一致;记事本保存的 ANSI 文件在 Windows 上其实是 GBK,写
"UTF-8"就会乱码——建议先用编辑器确认编码,或统一用 UTF-8 保存 HTML - 如果文件含 BOM(尤其 UTF-8 with BOM),
parse()可能解析出奇怪的零宽字符,可用Files.readString(path, StandardCharsets.UTF_8).strip()预处理
Document 对象拿到后,怎么确认 HTML 真被读进来了
别急着 select(),先做三件事验证解析结果是否符合预期:
立即学习“前端免费学习笔记(深入)”;
- 打印
doc.outerHtml().length()—— 如果只有几十字节,大概率是空页、跳转页或反爬返回的提示页 - 检查
doc.title()是否为空或等于 "Just a moment..."、"Access Denied" 等典型拦截文案 - 用
doc.select("body").isEmpty()判断 body 是否存在;若为true,说明解析失败或内容被 JS 动态注入(Jsoup 不执行 JS)
这些检查花不了两行代码,却能省掉后面所有 selector 写对了却取不到数据的排查时间。


















