JupyterLab保存报错Failed to fetch?一文带你彻底排查与修复
单独跑一个print(hello world)然后顺手按保存红色弹窗就出现在JupyterLab右上角“File Save Error for Untitled2.ipynb Failed to fetch”。这个报错在JupyterLab用户群里出现频率非常高尤其是那些刚接触ipynb文件、直接用pip装完Python和JupyterLab就开始写代码的朋友第一次遇到基本都是懵的代码明明没报错为什么连保存都保存不了这里先澄清一件容易被绕晕的事报错里的“print”和打印机驱动、microsoft print to pdf那一类东西没有任何关系。这里的print就是Python内置函数报错也不是这个函数本身报出来的。真正出错的是JupyterLab的保存通道。不管你的单元格里写的是print、print还是for循环只要点保存这个错误都可能出现print只是恰好在你测试保存时被选中的那个操作。那“Failed to fetch”到底是什么为什么一个保存动作会牵出这么个莫名其妙的提示这篇文章我把这条错误链拆开讲清楚从JupyterLab的架构说起再给你一份可以直接照着做的排查清单和修复步骤。适合三类人看刚入门用JupyterLab的新手、在Windows和Linux服务器上都部署过Notebook环境的同学、以及被这个报错折磨过但一直没搞明白根因的“倒霉蛋”。1. 先拆开“Failed to fetch”错误发生在JupyterLab的哪一层1.1 JupyterLab的“前端—后端—内核”三层结构JupyterLab表面上是个网页应用但它的架构其实分三层。第一层是浏览器里的前端界面也就是你在页面上看到的编辑器、菜单、文件树。第二层是运行在服务器上的jupyter-server进程它负责处理文件读写、会话管理、内核调度这些后端逻辑。第三层是内核kernel也就是真正执行Python代码的独立进程通常是一个ipykernel进程它和前端、后端之间靠消息协议通信。保存一个notebook本质上是前端发起了一个HTTP请求把整个ipynb的JSON内容发送给后端的jupyter-server然后由后端把数据写入磁盘。这个过程和内核几乎没有直接关系内核只负责执行单元格里的代码它不参与文件保存。换句话说就算你的print代码执行得行云流水保存动作失败还是可能发生因为这是两条不同的链路。明白了这个结构再看“Failed to fetch”就有一个基本定位错误发生在浏览器和后端服务器之间的HTTP请求上而不是Python代码逻辑层。这个认知很重要能帮你把排查方向从“我代码写错了”拉回到“保存链路出了问题”。1.2 “Failed to fetch”不是后端返回的业务错误“Failed to fetch”这句话本身就是关键词它是浏览器端fetch API在请求彻底失败时的标准提示。注意它不是一个HTTP状态码。如果后端正常返回了一个错误码比如401、403、500浏览器会告诉你“Request failed with status code 401”之类的信息或者你在开发者工具里能看到具体的状态码。但“Failed to fetch”更像一种“消息根本没送达或者送出去了没人接”的状态。可能的情况包括前端和服务器的连接已经断开、服务器进程挂掉了、请求超时被中间层掐断、网络闪断、或者请求被某个代理服务器拦截。整个页面看上去还能操作但其实底层通道已经断了这时候点保存请求发出去石沉大海前端最终抛出的就是“Failed to fetch”。我见过很多人卡在这一点上因为JupyterLab界面不总是能及时反映出前后端连接的异常状态。有时候内核还活着界面也能滚动但保存接口就是不通。所以你得学会用浏览器开发者工具去看真相等会儿我会给你具体的检查方法。1.3 为什么“单独print”时容易撞上它很多人在帖子里描述这个问题时会说“我只是单独跑了一个print保存就报错”。听起来像是print做了什么坏事其实不然。原因更朴素运行单行print是测试notebook时最轻量的操作跑完这个单元格紧接着最自然的下一个动作就是按保存。换句话说print操作把“保存”这个动作推到了临界点但引发错误的不是那句print而是保存这个动作本身。还有一个隐藏因素print输出内容是通过WebSocket通道推送到前端的。如果你刷新过页面、挂起过电脑、或者网络切换过状态可能已经变成“假活”。这时候一个print跑完界面看起来一切正常但底层WebSocket可能早就断了随后的保存请求也就跟着失败。我自己遇到的一次就是这样笔记本合盖再打开Wi-Fi重连了JupyterLab页面还能点但保存已经失败刷新之后重新登录才恢复正常。所以别被“单独print”这个说法带偏你应该关注的是在最后一次成功保存到这次报错之间前端和后端的连接发生了什么变化。2. 逐个排查保存失败的四类高频原因2.1 嫌疑一号token失效或服务重启JupyterLab默认启动时会生成一个随机token这个token相当于进入服务器的钥匙。你第一次打开页面时输入的那串字符就是它。问题在于这个token每次重启服务都会变。如果你已经登录过页面然后某个同事或你自己在服务器上重启了JupyterLab服务前端页面还停留在旧连接状态表面上一切正常但发起的写请求已经过不了后端认证了。判断方法很暴力也很直接打开浏览器的开发者工具切到Network面板然后点保存找到那个请求。如果请求返回的没有正常JSON或者控制台里出现了关于token、x-xsrf-token、403这类字样基本就是认证问题。旧版本Jupyter Notebook里这种问题更明显新版JupyterLab会在服务重启后尝试重连但依然有概率失效。至于热词里提到的“import profile failed: failed to fetch remote profile with status 403 for”这个报错虽然说的是远程profile加载失败但背后也是同一个逻辑请求到达了后端但被403拒绝了说明认证或权限关卡没通过。遇到403状态码优先检查token、登录会话、以及反向代理是否丢了认证头信息。2.2 嫌疑二号磁盘权限与文件系统状态如果token没问题就要怀疑服务器上的磁盘和文件权限了。保存notebook的动作用的是先写临时文件再重命名的机制所以对目录的写权限要求很高。如果运行jupyter-server的用户对这个目录没有写权限保存就会失败。这个坑在Windows上尤其隐蔽。有些安全软件会实时扫描文件在你保存的一瞬间锁住文件JupyterLab写入失败前端就报“Failed to fetch”。另外很多新手直接双击启动JupyterLab工作目录在Program Files或者系统保护目录里权限经常不对。Linux上则是另一种情况用sudo安装或创建的目录属于root平时用普通用户启JupyterLab写不进去。快速验证方式在JupyterLab的终端里执行一条简单命令直接尝试创建一个文件。比如运行touch /path/to/notebooks/test.ipynb如果提示Permission denied那就是权限问题。如果没有终端权限也可以在服务器命令行里用同样的方式测或者检查ls -la看目录所有者和权限位。2.3 嫌疑三号反向代理的超时和缓冲区很多人都通过nginx或Apache把JupyterLab暴露到某个域名或端口下访问。这就要注意反向代理的默认行为nginx默认的proxy_read_timeout是60秒意思是后端如果60秒内没给出响应nginx会自动断掉连接让浏览器拿到一个“连接被重置”的结果前端就会显示“Failed to fetch”。别觉得60秒很充裕。一个 notebook 文件里如果塞了很多单元格输出、嵌了图片、写了大段的DataFrame表格整个ipynb的JSON体积会非常大。保存时上传给后端的请求体可能几十兆后端的IO再慢一点超过60秒并不是天方夜谭。再加上JupyterLab本身还要维护WebSocket通道如果代理没配置好Upgrade头和连接升级选项页面加载出来了但实时通道早就断了保存失败就变成家常便饭。这里我给出一个最小可用的反代配置参考这些参数不是锦上添花是刚需location / { proxy_pass http://127.0.0.1:8888; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_request_buffering off; }核心就两个请求超时拉长WebSocket升级头补上。没有这两条JupyterLab跑在nginx后面就是薛定谔的可用状态时好时坏。2.4 嫌疑四号内核状态与前端假活内核崩溃是另一个常见诱因。内核进程因为内存溢出、OOM killer介入、或者代码里有人直接调了os._exit()就会悄悄退出。前端有时候不会立刻弹出“内核挂了”的提示特别是浏览器标签页在后台休眠过状态同步会延迟。这时候你看到的不一定是直接黑屏或红字而是e文档还能打开、单元格还能运行但运行结果迟迟不回来保存也一直转圈。我习惯的做法是先用菜单里的Kernel - Restart Kernel把内核拉起来一次。如果重启后保存正常了说明问题就出在内核或内核连接上和文件系统、代理都没关系。此外还要留意系统本身的资源。内核若把内存和CPU吃满整个jupyter-server都响应不过来保存请求自然超时。排查时可以切到服务器终端看top或任务管理器确认到底是谁在消耗资源。3. 按顺序操作从快速恢复到配置修复3.1 最快恢复三步刷新、重新登录、重启内核遇到保存报错先别急着改配置按这三步走八成能救回来。第一步浏览器刷新页面。别小看这个动作JupyterLab重新加载后会重新建立WebSocket连接很多“假活”状态在这一步就会被清掉。刷新前建议先把没保存的单元格代码复制到一个临时文件里尤其是那些运行了一半、输出还没来得及落盘的notebook以防前端状态真的起不来。第二步如果刷新后弹出密码或token输入框说明服务器已经不认识你这个旧会话了。去服务器命令行执行jupyter server list能看到当前运行的端口和token把那一整串粘贴进去重新登录。第三步进入页面后点菜单Kernel - Restart Kernel把内核重启一次。这时候再重新执行一次之前的代码然后点保存。大多数由连接异常引起的保存失败在这个流程之后都能解决。如果问题依旧才需要深入到服务和配置层面。3.2 重启JupyterLab服务时的正确姿势不要一上来就kill -9那会让正在运行的notebook内核全部变成孤儿进程数据丢失是小事端口还可能被残留进程占住。优先用优雅方式关闭前台启动的话直接按CtrlC服务会收到SIGINT逐步关闭。如果是后台运行可以先查看进程ps -ef | grep jupyter找到对应的PID后先用kill PID尝试优雅停止。如果等了几秒还没退出再考虑强制结束。Windows上可以在任务管理器结束进程或者找到启动窗口按CtrlC。服务重启后token会变。如果不想每次重启服务后都重新登录可以在启动命令里指定固定tokenjupyter lab --ServerApp.tokenyour-strong-token这里提醒一句不要图方便设成空字符串。我知道很多人会在本机设一个空token图省事但如果这个服务被暴露到公网等于把编辑器的门敞开了扫描工具几分钟就能找到你。固定token要有一定强度哪怕只是开发机也一样。3.3 修改JupyterLab配置固定token、根目录与超时如果保存报错反复出现就别再每次手动救火了直接在配置文件里把环境固定下来。新版JupyterLab的配置文件名是jupyter_server_config.py旧版是jupyter_notebook_config.py两个文件如果存在都会被读取。先执行一次jupyter server --generate-config生成文件后再编辑。几个关键项我按重要性排一下c.ServerApp.token your-strong-token c.ServerApp.port 8888 c.ServerApp.root_dir /home/yourname/notebooksroot_dir尤其容易被忽略。很多人启动JupyterLab时是在某个临时目录里比如C:\Users\xxx\AppData\Local\Temp这个目录随时可能被清理保存失败只是时间问题。手动指定一个固定、可写的notebook根目录能少掉一大半幺蛾子。如果你是通过反向代理访问确认代理配置里保留了下述请求头Authorization、X-XSRFToken、Cookie。新版jupyter-server默认开启CSRF校验反向代理如果把Cookie或XSRF相关的头弄丢了保存时会直接被拒绝虽然界面可能弹的是403但表现经常是“Failed to fetch”需要一起排查。3.4 端口占用和环境变量错乱怎么办直接装Python和JupyterLab的新手很容易碰上端口冲突上次的jupyter进程没退干净再次启动时报Address already in use。解决办法是先查谁占了端口lsof -i :8888Windows上对应的命令是netstat -ano | findstr :8888找到PID后结束进程或者干脆换一个端口用jupyter lab --port 8890启动。环境变量错乱则更隐蔽特别是机器上同时装了Anaconda、官方Python、又通过pip装过不同版本的Jupyter。你命令行敲jupyter时系统可能调用了某个旧环境里的命令和正在运行的服务根本不是同一个版本。排查方式很简单先where jupyterWindows或which jupyterLinux看实际指向哪个路径。如果发现有多个jupyter命令最好显式用完整路径启动服务不要和系统默认环境搅在一起。4. 常见问题速查与两个容易被忽略的坑4.1 报错场景对照表我把平时遇到过的典型场景整理成一张表方便你对照排查场景可能原因处理方式保存时提示Failed to fetch控制台出现token相关字样token失效或服务重启重新登录或用jupyter server list获取新token保存失败但页面浏览文件、打开notebook都正常磁盘权限或目录不可写检查root_dir和目录写权限手动测试创建文件保存大文件时失败小文件正常反代超时或请求缓冲调大nginx的read/send timeout关闭request buffering保存时转圈很久后失败内核状态显示异常内核崩溃或前后端连接断开重启内核必要时重启服务网络切换或合盖休眠后开始报错Websocket连接失效刷新页面重新连接不要恋战控制台看到的不是Connection error而是403token或CSRF校验失败检查认证请求头、CSRF token反代别丢Cookie这张表不能覆盖所有情况但日常遇到的保存报错九成都在里面。4.2 坑一浏览器插件拦截POST请求这个坑特别隐蔽。某些广告拦截类、安全类、或者开发者工具类浏览器插件会拦截到请求的URL或文件扩展名直接把它挡掉。我之前一次排查前后折腾了半小时最后发现是某插件把包含.ipynb的POST请求默认给拦了。换到无痕模式测试一下或者在插件设置里加白名单问题立刻消失。如果你发现保存失败只发生在特定浏览器里Chrome失败但Firefox正常那几乎可以断定是插件问题。和JupyterLab本身没有关系。4.3 坑二文件名和目录里的特殊字符JupyterLab默认的Untitled2.ipynb这种文件名本身没问题但有些用户给文件起名字喜欢用中文、空格、括号、#这类特殊字符。前端在构造请求URL时如果编码处理得不够干净保存请求就可能因为URL格式问题直接被服务器或中间层拒掉表现也是“Failed to fetch”。解决办法是让notebook文件名保持简单只用字母、数字、下划线、连字符不要用中文和空格。目录路径也一样尽量避免带特殊字符的深层路径。这个习惯一旦养成能帮你在以后所有基于文件名做操作的场景里省下不少麻烦。最后再聊两句我的实际体会我自己的排查习惯是遇到保存报错先不慌着改代码第一步永远打开浏览器开发者工具的Network面板把保存请求的状态看清楚。究竟是请求没发出去、发了没有响应、还是响应了但被代理掐了这三个分支对应的处理方式完全不同。浪费在猜测上的时间远比自己动手查一下要多。另一个心得是JupyterLab服务端的启动日志非常有用。前端报“Failed to fetch”时后端日志往往会给出根本原因比如“Permission denied”“Kernel died”“Address already in use”。我建议你把启动JupyterLab的那个终端窗口留着别随手关掉出了任何诡异问题先去看那一段日志。如果你是在一台长期使用、频繁处理大脚本的机器上工作与其等保存失败再修不如提前把固定token、可写目录、反代超时这几件事一次性配好。这套配置前前后后花不了十分钟却能让你少很多莫名的心烦。

相关新闻

历代iPhone主要参数对比表:二手选购与老机续用指南

历代iPhone主要参数对比表:二手选购与老机续用指南

手里攒着几台旧 iPhone,想给家里人换机,或者自己在二手市场淘一台,第一件事从来不是看卖家报价,而是把历代 iPhone 的主要参数摊开逐项对一遍。这份历代 iPhone 主要参数对比表,最早是我 2019 年给自己买二手机时随手记…

2026/10/1 17:54:24 阅读更多 →
gcc与g++的区别:用gcc编译C++的方法与常见坑

gcc与g++的区别:用gcc编译C++的方法与常见坑

那段时间我频繁在 Linux 命令行下处理 C/C 小项目,最常用的一条命令就是gcc -o demo demo.c。直到有一次我改了后缀名,把源码保存成demo.cpp,依然习惯性敲下gcc -o demo demo.cpp,结果终端刷出一堆undefined reference to std::co…

2026/10/1 17:54:24 阅读更多 →
C语言void完全指南:void指针、函数设计与编译避坑

C语言void完全指南:void指针、函数设计与编译避坑

1. void到底代表了什么:先把它说透 C语言里,void可能是看着最简单、用起来门道最多的关键字。我在嵌入式开发和通用容器库中没少和它打交道。这一篇我打算把void的用法从头到尾捋一遍:从“空类型”的定义,到函数设计、void指针、以…

2026/10/1 17:53:24 阅读更多 →

最新新闻

KV Cache 理论入门:从注意力机制到 Prefix Caching 的推理架构拆解

KV Cache 理论入门:从注意力机制到 Prefix Caching 的推理架构拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:05:31 阅读更多 →
2026 AI Agent编程大战——Cursor、Devin、Claude Code谁才是真正的“AI码农“?TaoToken统一Key实测

2026 AI Agent编程大战——Cursor、Devin、Claude Code谁才是真正的“AI码农“?TaoToken统一Key实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:05:31 阅读更多 →
AnimGen原理与实战:UE5中如何用机器学习生成骨骼动画

AnimGen原理与实战:UE5中如何用机器学习生成骨骼动画

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:05:31 阅读更多 →
VSCode 常见插件配置 TaoToken:settings.json 骨架与验证动作

VSCode 常见插件配置 TaoToken:settings.json 骨架与验证动作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:05:31 阅读更多 →
Word目录页码全为2的根源与五步修复法

Word目录页码全为2的根源与五步修复法

1. 这个问题到底在折腾谁?——从一次真实崩溃现场说起“Word文档点击打印,目录页码却全是2”,这句话刚在公司内部技术群里冒出来,我就知道又到了一年一度的“毕业季/汇报季/结题季”高发期。上周帮市场部同事处理一份38页的年度品…

2026/10/1 20:05:31 阅读更多 →
图幅接合图表实战指南:标准分幅规则与GIS应用全解析

图幅接合图表实战指南:标准分幅规则与GIS应用全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:04:31 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →