0

0

如何读取html_读取HTML文件内容或元素的技巧【指南】

絕刀狂花

絕刀狂花

发布时间:2026-01-09 18:25:22

|

996人浏览过

|

来源于php中文网

原创

fetch 读取本地 HTML 文件触发 CORS 错误是因 file:// 协议被浏览器禁止跨域请求,解决方法是部署到本地 HTTP 服务或改用 XMLHttpRequest;DOMParser 解析 HTML 字符串更安全;Node.js 中需用 fs 读取文件并注意编码与路径。

如何读取html_读取html文件内容或元素的技巧【指南】

fetch 读取本地 HTML 文件会触发 CORS 错误

浏览器直接用 fetch('./page.html') 加载本地 HTML 文件时,如果页面是通过 file:// 协议打开的,绝大多数现代浏览器会拒绝请求,并抛出类似 Blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. 的错误。

这不是代码写错了,而是浏览器安全策略限制——file:// 协议不被视作合法的跨域请求源。解决方法只有两个:

  • 把页面部署到本地 HTTP 服务上(推荐),比如用 npx servepython3 -m http.server 或 VS Code 的 Live Server 插件
  • 改用 XMLHttpRequest 并设置 responseType = 'document'(仅限同源且非 file:// 场景)

别试图用 readAsText + FileReader 去读取用户选择的 HTML 文件——那只能用于 显式选取的场景,不适用于预设路径加载。

DOMParser 解析 HTML 字符串比 innerHTML 更安全可靠

当你拿到一段 HTML 字符串(比如从 fetch 返回的 text() 结果),想提取其中的 或某个 class="content" 元素,不要直接往 div.innerHTML 里塞再查——这会执行内联脚本、触发图片加载、污染当前页面 DOM。

立即学习前端免费学习笔记(深入)”;

DOMParser 是专为此设计的轻量级解析器,它生成的是独立文档对象,完全隔离:

const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
const title = doc.querySelector('title')?.textContent;
const mainContent = doc.querySelector('.content')?.outerHTML;

注意两点:

  • MIME 类型必须写成 'text/html',写成 'application/xml' 或漏掉会导致解析失败或行为异常
  • doc 是完整文档,所以 querySelector 能直接匹配 下的元素,无需额外包裹

Node.js 环境下读取 HTML 文件要用 fs.readFileSyncfs.promises.readFile

在 Node.js 里没有 fetch,也不能用 DOMParser(原生不支持),得靠第三方库补全 DOM 能力。但第一步永远是把文件内容读成字符串:

堆友
堆友

Alibaba Design打造的设计师全成长周期服务平台,旨在成为设计师的好朋友

下载
const fs = require('fs');
const html = fs.readFileSync('./index.html', 'utf8');

或者用 Promise 版本:

const { readFile } = require('fs').promises;
const html = await readFile('./index.html', 'utf8');

常见坑:

  • 忘记传 'utf8' 编码参数,结果得到 Buffer,后续 parseFromString 会报错
  • 路径写相对路径却没注意工作目录(process.cwd()),建议用 path.resolve(__dirname, 'index.html') 定位

之后才能交给 jsdomcheerio 处理。例如 cheerio 的典型用法:

const $ = require('cheerio');
const html = fs.readFileSync('./index.html', 'utf8');
const $html = $.load(html);
const title = $html('title').text();

cheerio 提取元素比原生 DOM API 更适合服务端批量处理

如果你在 Node.js 中要批量分析几十个 HTML 文件、提取标题、链接、元数据,cheerio 是更优选择:它模拟了 jQuery API,语法简洁,不渲染、不执行 JS、内存占用低。

对比 jsdom

  • cheerio 没有 windowdocument 全局对象,不能运行脚本,但解析速度通常快 3–5 倍
  • cheerio.load() 返回的是“伪 DOM”,所有选择器操作都基于字符串分析,因此不支持 :has():nth-child(2n) 等复杂 CSS4 伪类(除非升级到 v1.0+ 并启用 xmlMode: false
  • 若 HTML 不规范(如自闭合标签写成 如何读取html_读取HTML文件内容或元素的技巧【指南】 而非 如何读取html_读取HTML文件内容或元素的技巧【指南】),cheerio 默认能容错,DOMParser 在严格模式下可能报错

一个真实场景示例:提取所有带 href 的外链,并排除站内路径:

const $ = require('cheerio');
const html = fs.readFileSync('page.html', 'utf8');
const $html = $.load(html);
const externalLinks = [];
$html('a[href]').each((i, el) => {
  const href = $html(el).attr('href');
  if (href && /^https?:\/\//.test(href)) {
    externalLinks.push(href);
  }
});
实际处理 HTML 时,最易被忽略的是编码识别——特别是老站点用 gbkbig5 编码却没声明 ,这时 fs.readFileSyncfetch 拿到的内容会乱码,后续所有解析都失效。遇到这类情况,得先用 iconv-liteencoding-sniffer 探测真实编码再转 UTF-8。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

393

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

494

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

178

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

118

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

172

2024.02.23

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

763

2023.08.11

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

CSS教程
CSS教程

共754课时 | 18.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号