问题:CSDN 文章保存太难了
CSDN 几个让人抓狂的体验:
- 非登录用户只能看到正文一半,后半截被"关注作者"挡住
- 代码块被"展开全部"按钮折叠,要手动点开才能看完整代码
- 侧边栏一堆广告,打印 / 另存为 PDF 时把版面挤得一塌糊涂
- 各种弹窗(下载 App、关注我们、登录提示)
下面这个油猴脚本(Tampermonkey)的作用:进入任意 CSDN 文章页,自动:
- 移除"关注作者继续阅读"遮罩,显示完整正文
- 点开所有代码块的"展开",显示完整代码
- 删除侧边栏、广告、底部推荐、登录提示
- 在页面右下角加 三个按钮:打印 / 保存 / 优化
- 点"保存"时调浏览器原生打印,可以"另存为 PDF"得到干净的版本

安装方法
前提:浏览器装了 Tampermonkey 扩展(Chrome / Edge / Firefox 都支持)。
- 点击 Tampermonkey 图标 → "创建新脚本"
- 把下面整段代码粘进去,替换默认的模板
- Ctrl+S 保存
- 访问任意 CSDN 文章页,刷新一下,右下角应该看到三个按钮
完整脚本
// ==UserScript==
// @name CSDN 文章优化保存
// @version 2024-05-12
// @description csdn文章优化保存
// @author hualy13
// @match *://blog.csdn.net/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=csdn.net
// ==/UserScript==
(function() {
'use strict';
//不用关注博主即可阅读全文
window.addEventListener('load', function() {
// 移除 article_content 元素的内联样式
var articleContent = document.getElementById("article_content");
if (articleContent) {
articleContent.removeAttribute("style");
}
// 移除特定的元素
var followTextParent = document.querySelector('.follow-text')?.closest('[data-flag="follow"]');
if (followTextParent) {
followTextParent.remove();
}
var hideArticleBox = document.querySelector('.hide-article-box');
if (hideArticleBox) {
hideArticleBox.remove();
}
});
//模拟点击
window.addEventListener('load', function() {
var selectors = ['.sidecolumn-hide', '.hide-preCode-bt','sidecolumn-show'];
selectors.forEach(function(selector) {
var element = document.querySelector(selector);
if (element) {
element.click();
}
});
});
// 定义要删除的ID数组和类名数组
var idsToRemove = ['csdn-toolbar', 'toolBarBox', 'recommendNps', 'toolbarBox','treeSkill'];
var classesToRemove = ['blog_container_aside', 'recommend-box', 'comment-box', 'blog-footer-bottom', 'csdn-side-toolbar','passport-login-container'];
// 删除指定ID和类名的元素
function removeElements() {
// var hideElement = document.querySelector('.sidecolumn-hide');
// if (hideElement) {
// hideElement.click();
// }
removeElementsById(idsToRemove);
removeElementsByClass(classesToRemove);
}
// 删除指定ID的元素
function removeElementsById(ids) {
ids.forEach(function(id) {
var element = document.getElementById(id);
if (element) element.parentNode.removeChild(element);
});
}
// 删除指定类名的元素
function removeElementsByClass(classes) {
classes.forEach(function(className) {
var elements = document.getElementsByClassName(className);
while(elements.length > 0) {
elements[0].parentNode.removeChild(elements[0]);
}
});
}
// 监听打印事件并在打印时隐藏按钮
function setupPrintListener(buttons) {
window.matchMedia('print').addListener(function(mql) {
if (mql.matches) {
// 打印开始,隐藏按钮
buttons.forEach(function(button) {
button.style.display = 'none';
});
} else {
// 打印结束,显示按钮
buttons.forEach(function(button) {
button.style.display = '';
});
}
});
}
// 创建按钮并添加点击事件
var buttons = [];
var buttonNames = ['优化', '保存', '优化保存'];
var buttonsContainer = document.createElement('div');
buttonsContainer.style.display = 'flex';
buttonsContainer.style.flexDirection = 'column';
buttonsContainer.style.alignItems = 'flex-end';
buttonsContainer.style.position = 'fixed';
buttonsContainer.style.top = '100px';
buttonsContainer.style.right = '10px';
buttonsContainer.style.zIndex = '1000';
buttonNames.forEach(function(name) {
var button = document.createElement('button');
button.textContent = name;
button.style.margin = '5px 0';
button.style.padding = '10px 20px';
// 分配点击事件
button.onclick = function() {
if (name === '优化保存') {
removeElements(); // 删除元素
window.print(); // 触发打印
}
else if (name === '保存') {
window.print(); // 触发打印
}
else if (name === '优化') {
removeElements(); // 删除元素
}
};
buttons.push(button); // 添加按钮到数组
buttonsContainer.appendChild(button); // 添加按钮到容器
});
document.body.appendChild(buttonsContainer); // 将按钮容器添加到页面
// 设置打印事件监听器
setupPrintListener(buttons);
})();
脚本工作原理
1. 监听 load 事件,做 DOM 清理 —— 把 CSDN 限制阅读的几个 DOM 节点直接干掉(关注遮罩、隐藏正文容器等)。
2. 模拟点击"展开代码"按钮 —— CSDN 的代码块默认只展示几行,有一个"展开"按钮。脚本直接帮你点一下。
3. 删除一堆 ID / 类名 —— 把侧边栏、底部、广告、登录框这些垃圾一并清掉,打印时页面只剩正文。
4. 注入操作按钮 —— 在页面右下角浮一个按钮组,提供"打印 / 保存 / 优化"三个动作。
常见问题
1. 装了脚本但右下角看不到按钮
- 检查 Tampermonkey 扩展是否开着
- 检查脚本的
@match是否包含当前页(CSDN 的文章 URL 是blog.csdn.net/xxx) - F12 看 console 有没有报错
2. 打印出来还是有广告 / 侧栏
CSDN 的 DOM 结构会更新,脚本里写死的类名 / ID 可能失效。F12 看一下那个元素的当前 class 是什么,加到脚本的 classesToRemove 数组里。
3. 想保留评论
这个脚本是为"干净保存正文"设计的,会把评论也删掉。要保留评论,把 classesToRemove 里的 "comment-box" 删掉。
4. 想直接拿 Markdown 不是 PDF
这个脚本不做 Markdown 转换。可以装另一个工具"Markdown Viewer"浏览器扩展,或者用 turndown.js 改造。
类似的"反吸血"脚本
- 知乎增强 —— 移除登录强制、显示完整答案
- 简书全文阅读 —— 解除阅读限制
- 百度搜索净化 —— 过滤广告、跳过百度知道
- 微信公众号文章优化 —— 显示原文链接、转 Markdown
Greasyfork 上一搜一大堆。装一波,中文互联网阅读体验起码提升 50%。
免责声明
本脚本只是客户端 DOM 操作,不破解任何加密、不绕过任何付费内容,只是把已经在用户浏览器里的元素重新排列。保存的也是公开可见的文章。但出于尊重原创,保存下来的内容仅供个人备份,不要二次转发到自己的平台。
—— 别看了 · 2026