1. 浏览器环境:在网页的 <script> 标签中运行。
  2. Node.js 环境:在服务器端运行。
  3. 浏览器开发者工具:作为开发者进行调试时使用。

下面我将详细解释这三种情况。

javascript获取网页源代码
(图片来源网络,侵删)

浏览器环境

在浏览器中,JavaScript 出于安全考虑,无法直接获取完整的、包含所有 <script><style> 标签解析后的 HTML 源代码,你只能获取到当前文档的 DOM (Document Object Model) 结构,也就是浏览器已经解析和渲染后的 HTML 树。

获取当前页面的 DOM 结构

这是最常见的需求,你可以使用 document.documentElement.outerHTML 来获取整个 HTML 文档的字符串表示。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">测试页面</title>
    <style>
        body { font-family: sans-serif; }
        #myDiv { color: blue; }
    </style>
</head>
<body>
    <h1>这是一个标题</h1>
    <div id="myDiv">这是一个 div。</div>
    <script>
        // 当页面完全加载后执行
        window.onload = function() {
            // 方法一:获取整个 HTML 文档的字符串
            // 这会返回一个包含 <html>, <head>, <body> 等标签的完整字符串
            const fullHtmlSource = document.documentElement.outerHTML;
            console.log("--- 获取完整的 DOM 源代码 ---");
            console.log(fullHtmlSource);
            // 方法二:只获取 <body> 标签内的 HTML
            const bodyHtmlSource = document.body.innerHTML;
            console.log("\n--- 只获取 <body> 内的 HTML ---");
            console.log(bodyHtmlSource);
            // 方法三:获取特定元素的 HTML
            const myDivSource = document.getElementById('myDiv').outerHTML;
            console.log("\n--- 获取 id 为 'myDiv' 的元素的 HTML ---");
            console.log(myDivSource);
        };
    </script>
</body>
</html>

重要区别:

javascript获取网页源代码
(图片来源网络,侵删)
  • document.documentElement.outerHTML:获取整个 <html> 元素的源代码,包括 <head><body>
  • document.body.innerHTML:获取 <body> 元素内部的 HTML 代码。
  • element.innerHTML / element.outerHTML:获取特定 DOM 元素的内部或外部 HTML。

局限性: 这种方法获取的是浏览器解析后的 DOM,而不是服务器原始返回的 HTML。

  • 所有脚本(<script>)都已经执行完毕,你看到的是执行后的结果,而不是脚本代码本身。
  • 所有 CSS 样式已经应用,你看到的是渲染后的样式,而不是 <style> 标签里的 CSS 文本。
  • 像实体(&nbsp;)可能已经被转换成空格。

Node.js 环境

在 Node.js 中,你可以轻松地获取任何网页的原始 HTML 源代码,因为它可以像浏览器一样发送 HTTP 请求。

使用 httpshttp 内置模块(无需安装)

这是最基础的方法,适用于 httpshttp 协议。

const https = require('https');
const url = 'https://www.example.com';
https.get(url, (res) => {
    // 检查响应状态码
    if (res.statusCode !== 200) {
        console.error(`请求失败,状态码: ${res.statusCode}`);
        res.resume(); // 消耗响应数据以释放内存
        return;
    }
    let rawData = '';
    // 监听 'data' 事件,每当接收到数据块时触发
    res.on('data', (chunk) => {
        rawData += chunk;
    });
    // 监听 'end' 事件,当所有数据接收完毕时触发
    res.on('end', () => {
        try {
            // rawData 就是网页的完整源代码
            console.log(rawData);
            // 在这里可以对 rawData 进行处理,例如使用 cheerio 解析
        } catch (e) {
            console.error('解析数据时出错:', e);
        }
    });
}).on('error', (err) => {
    console.error('请求发生错误:', err);
});

使用第三方库 axiosnode-fetch(推荐)

这些库提供了更简洁、更强大的 API(Promise 支持),是现代 Node.js 开发的首选。

javascript获取网页源代码
(图片来源网络,侵删)

安装库:

npm install axios
# 或者
npm install node-fetch

使用 axios 的示例:

const axios = require('axios');
const url = 'https://www.example.com';
axios.get(url)
    .then(response => {
        // response.data 就是网页的源代码
        // axios 会自动处理 Gzip 压缩等
        console.log(response.data);
    })
    .catch(error => {
        console.error('获取网页源代码时出错:', error);
    });

使用 node-fetch 的示例:

const fetch = require('node-fetch');
const url = 'https://www.example.com';
fetch(url)
    .then(response => {
        // 检查请求是否成功
        if (!response.ok) {
            throw new Error(`HTTP 错误! 状态: ${response.status}`);
        }
        // 将响应体读取为文本
        return response.text();
    })
    .then(body => {
        // body 就是网页的源代码
        console.log(body);
    })
    .catch(error => {
        console.error('获取网页源代码时出错:', error);
    });

浏览器开发者工具

如果你只是想查看某个网页的源代码进行调试,而不是通过程序获取,那么最简单的方法就是使用浏览器开发者工具。

  1. 打开开发者工具

    • 在 Chrome、Edge、Firefox 等现代浏览器中,按 F12 键。
    • 或者,在页面上点击鼠标右键,选择“检查”(Inspect)。
  2. 查看源代码

    • 在开发者工具中,切换到 "Elements" (元素) 选项卡,这里显示的是实时的、可交互的 DOM 结构,你可以看到所有元素及其当前样式。
    • 切换到 "Sources" (源代码) 选项卡,这里显示的是原始的、未解析的 HTML、CSS 和 JavaScript 文件,这与你右键点击页面选择“查看网页源代码”(View Page Source) 看到的内容是一致的。

环境 方法 说明 适用场景
浏览器 document.documentElement.outerHTML 获取解析后的 DOM 字符串。 在当前页面内操作、修改或读取已渲染的 HTML 结构。
Node.js axios / node-fetch / https 获取原始的 HTML 响应。 爬虫、服务器端抓取数据、API 请求。
调试 浏览器开发者工具 (F12) 查看原始实时的代码。 开发者手动检查网页结构、样式和脚本。

根据你的具体需求选择最合适的方法,如果你想在网页上获取源代码,用的是浏览器环境;如果你想在服务器上获取源代码,用的是 Node.js 环境。