httpurlconnection可发起get请求获取html源码,需设置user-agent、正确解析content-type中的charset;jsoup用于解析html并提取标题、链接等,支持修复不规范html,适合静态内容抓取与简易文本渲染。

用 HttpURLConnection 发起 GET 请求并读取 HTML 响应体
Java 标准库不带浏览器引擎,但能完成「获取网页源码」这一基础动作。关键不是模拟浏览器,而是拿到原始 HTML 字符串——HttpURLConnection 足够轻量且无需额外依赖。
常见错误是忽略响应编码导致中文乱码,或未设置 User-Agent 被部分网站拒绝访问:
- 务必调用
connection.setRequestProperty("User-Agent", "Mozilla/5.0") - 用
connection.getContentEncoding()不可靠,应优先检查Content-Type头里的charset=, fallback 到UTF-8 - 读取流时用
InputStreamReader显式指定编码,别依赖平台默认编码
示例片段:
URL url = new URL("https://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
conn.connect();
String charset = "UTF-8";
String contentType = conn.getContentType();
if (contentType != null && contentType.contains("charset=")) {
charset = contentType.split("charset=")[1].split(";")[0].trim();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
用 Jsoup 解析 HTML 并提取标题、链接与文本节点
原生 DocumentBuilder 对不规范 HTML(如缺失闭合标签)容错差,Jsoup 是事实标准:它能修复 malformed HTML,并提供类似 CSS 选择器的简洁语法。
立即学习“Java免费学习笔记(深入)”;
注意它默认不执行 JavaScript,也不加载外部资源(CSS/图片),纯解析静态 HTML:
- 用
Jsoup.connect(url).get()可合并请求+解析,但底层仍走 HTTP,不支持 cookie 持久化或重定向链追踪 - 提取标题:
doc.title()比doc.select("title").text()更安全(后者在无<title></title>时返回空字符串) - 提取所有链接:
doc.select("a[href]").eachElement().attr("href"),注意相对 URL 需用abs:href获取绝对地址
手动渲染简易文本页面:把 <h1></h1>、<p></p>、<a></a> 转成带缩进的控制台输出
没有 WebView 或 Swing 组件时,最简“渲染”就是结构化打印。重点不是样式还原,而是保留语义层级和可读性。
容易被忽略的是 HTML 实体(如 、<)和嵌套深度控制:
- 用
Jsoup.parse(html).body().childNodes()遍历顶层节点,递归处理子节点时传入缩进层级 - 对
<a></a>标签,同时输出文本 +abs:href,避免点击无效 - 调用
node.outerHtml()会包含标签本身,而node.text()丢失结构;折中做法是按标签类型定制输出逻辑
例如:<h1>Hello</h1> → 打印为 "【标题】Hello",<p>段落</p> → " 段落"(两个全角空格缩进)
为什么不用 WebView(JavaFX)或 JEditorPane?
它们看似更“像浏览器”,但实际限制极多:JEditorPane 仅支持 HTML 3.2,无法解析 <section></section>、<nav></nav> 等现代标签;WebView 依赖 JavaFX 运行时,在 JDK 11+ 需单独引入模块,且启动慢、内存占用高。
如果你的目标只是「输入 URL → 输出可读文本内容」,这些组件反而增加部署复杂度和兼容性风险。真正需要交互式 DOM 操作或 JS 执行时,才该考虑切换到 Selenium 或嵌入 Chromium(如 JCEF)。
多数简易场景下,HttpURLConnection + Jsoup 的组合已覆盖 90% 的抓取与展示需求,关键在于别把「解析」和「渲染」混为一谈——先稳稳拿到数据,再决定怎么呈现。











