
这个工具解决什么问题
看到一篇好文章想存进笔记,最笨的办法是选中正文复制,但网页上到处都是干扰:顶部导航、右侧推荐、文末相关阅读、评论区,鼠标一拖往往把「相关阅读」也带进去,粘到笔记里还得手工删。更麻烦的是文章里有表格和列表,复制过去格式全丢,变成一坨没换行的文字,重新排版又要十分钟。想用「另存为」吧,存下来的是一整页 HTML,导航广告一个不少。想写脚本抓正文,又得先搞懂 Readability 那一套算法。
- 原来的做法:在网页上拖选正文复制到笔记,手工删掉夹带的导航和推荐链接;遇到表格列表就一条条重排,一篇文章整理下来十几分钟。
- 用这个工具:把网页源码粘进左边,右边立刻出现干净的 Markdown 正文——导航、侧栏、评论、页脚都被剔掉,标题/列表/引用/表格/链接/图片自动转成 Markdown 语法,一键复制或导出 .md。
- 省下来的:原来存一篇文章要十几分钟手工整理,现在粘贴即出结果,几秒钟拿到可以直接用的 Markdown;表格和列表的格式也不再丢。
技术实现
一个 HTML 文件,内联 CSS 与 JavaScript,双击用浏览器打开就能用。选单文件网页是因为这类工具的本质是「一次性动作」:偶尔存一篇文章,不该为它装一个软件。而正文提取和 HTML 转 Markdown 恰好都是浏览器最擅长的事——DOMParser 负责按标准解析 HTML,递归遍历负责把 DOM 树翻译成 Markdown,全程在本地完成,页面里没有任何网络请求代码。
- 三级策略定位正文,而不是简单取 body:第一级信语义标签:页面里有 article 或 main 标签就直接用它——这两个标签在规范里就是为正文准备的,命中率极高。第二级才用打分:对每个 div/section/td 算「文本长度 − 1.5×链接文本长度 + 35×段落数 + 3×标点数」,链接占比超过一半的直接淘汰(那是导航或列表页)。第三级是向下精炼:父容器常常因为「字数更多」而胜出(正文 + 一点残留),所以逐层往下找更紧的容器,只要子容器分数不低于父的 90% 就继续下沉。
- 先删噪声再打分,两套规则配合:噪声分两类处理。按标签删:script/style/noscript/iframe/svg/canvas/form/nav/header/footer/aside/button 这些整体移除。按 class/id 关键词删:nav、sidebar、footer、comment、related、recommend、advert、breadcrumb、share、pagination,以及中文的「推荐/广告/评论/导航/侧栏/页脚/相关阅读」。第二类加了一道保险——只有当该容器里几乎没有 p 或 article 子节点时才删,避免误删那些恰好叫 header 的正文标题块。
- DOM 树递归翻译成 Markdown:写两套遍历:blockMd 处理块级元素(标题、段落、列表、引用、代码块、表格、分隔线),inlineMd 处理行内元素(加粗、斜体、行内代码、删除线、链接、图片)。列表单独处理——li 里的嵌套子列表要先把 ul/ol 摘出来递归渲染,否则子列表会被压进父项那一行。表格按第一行生成表头分隔行,列数不足的行补空单元格,单元格里的竖线转义成 \|。
- 转义只做必要的,正文不会满屏反斜杠:很多转换器为了「安全」把所有 Markdown 特殊字符都加反斜杠,结果正文里全是 \* 和 \_,根本没法读。这里只转义三个字符:反斜杠、星号、下划线、反引号——它们不加转义会真的改变渲染结果。方括号只在链接/图片的 alt 文本里处理,正文里的 [1] 这类引用标记保持原样。
- 相对链接补全用 URL 构造函数:文章里的链接常常是 /tools/ 这样的相对路径,直接抄进 Markdown 就失效了。工具提供一个「基准地址」输入框,填上原网页地址后,所有 a[href] 和 img[src] 都交给 new URL(raw, base) 解析成绝对地址。javascript:、mailto:、tel:、# 开头的链接判为非网址,保留文字但不生成链接。
- 零网络请求,且把「提取到哪儿」告诉用户:页面没有 fetch / XMLHttpRequest / 外部 CDN,断网可用。更重要的是:工具会把定位结果写在界面上——「已定位到正文容器:article.post-content(整页文本 275 字,正文 275 字)」。正文提取是启发式的,不可能 100% 准,与其让用户猜「为什么结果不对」,不如直接告诉他这次抓到了哪个容器,出问题时能立刻判断是页面结构特殊还是规则没命中。
技术栈:单 HTML 文件、原生 JavaScript、DOMParser + 递归 DOM 遍历、零依赖 / 零安装
已知局限:只解析你粘贴的源码,不主动访问网页(浏览器同源策略下也做不到);抓不到 JavaScript 动态渲染的内容,需要你复制渲染后的 DOM;正文定位是启发式的,对结构极特殊的页面(如全 div 无段落、正文与评论同容器)可能不准;不处理 CSS 隐藏的内容(display:none 的节点仍会被提取);不保留原页面的复杂嵌套排版(如多列布局)。
操作教程
- 打开工具
双击 tool.html(或拖进浏览器窗口)。页面打开时已经填好一段示例源码,右侧直接显示提取结果,方便先看清长什么样。
预期结果:页面显示左右两栏:左侧是源码输入框、基准地址与提取选项;右侧是统计条、Markdown/纯文本切换与结果区。 - 复制网页源码
在浏览器里打开目标网页,右键 → 查看源代码(或按 Ctrl+U),全选复制,粘进左侧输入框。也可以点「导入 .html 文件」直接读取本地保存的网页文件。
预期结果:粘贴后右侧立刻出现提取结果,统计条显示正文字数、段落、标题、链接、图片与阅读时长。 - 填基准地址(可选)
如果正文里有 /post/1.html 这样的相对链接,把原网页的完整地址填进「基准地址」,链接和图片地址会被补全成可直接打开的绝对地址。
预期结果:结果里的相对链接变成 https://… 开头的完整地址。 - 调整提取选项
按需要勾掉「保留超链接」「保留图片」「保留引用块」「保留表格」。比如只想拿纯文字,就把前两项取消。
预期结果:任意选项变化,右侧结果与统计立即重算。 - 检查定位结果
看结果区下方的提示:「已定位到正文容器:xxx(整页文本 N 字,正文 M 字)」。如果正文占整页的比例很低,说明可能没找准,可以试试换一段源码。
预期结果:多数常见文章页会定位到 article 或 main 容器。 - 复制或导出
点「复制结果」把当前视图(Markdown 或纯文本)写进剪贴板;点「导出 .md 文件」直接下载一个 article.md,可以丢进 Obsidian、Typora 等笔记工具。
预期结果:复制后粘贴出来是带标题层级的 Markdown;导出文件用编辑器打开格式完整。
全程在浏览器本地完成,不需要联网、不需要安装任何软件;工具只解析你粘贴的内容,不会主动访问任何网站。
常见问题
技术实现与后续维护
本工具由我们自行开发并持续维护,每次迭代都经过本地自测。代码分成三层:正文定位(stripNoise / hitHint / textLen / linkTextLen / scoreOf / extractArticle)、Markdown 转换(inlineMd / blockMd / listMd / tableMd / toPlain)、界面(run / render)。想调提取准度只动第一层,想改输出格式只动第二层。
技术构成:
src/tool.html—— 唯一源码文件:内联样式、正文定位算法、DOM→Markdown 转换器、界面与导出DOCS/开发文档.md—— 工程结构、三级定位策略与 Markdown 转换规则说明、实测数据
运行环境:
单 HTML 文件工具,无需编译。用任意现代浏览器(Chrome / Edge / Firefox / Safari)直接打开 src\tool.html 即可运行。
可扩展方向:
- 把 DROP_HINT 关键词表提取成界面可编辑的配置,方便适配特定站点
- 在 scoreOf() 里加入「标签多样性」因子,进一步降低列表页被误判的概率
- 增加 front-matter 导出模板(标题、来源 URL、抓取时间)
- 增加批量模式:读取本地多个 .html 文件依次转换并打包下载
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:网页正文混在导航广告评论里,想存下来只能一段段复制粘贴。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 增加「批量读取本地 HTML 文件夹」,一次把几十个保存的网页转成 Markdown
- 增加「直接粘贴渲染后 DOM」的快捷入口,省去查看源代码这一步
- 增加「自定义噪声规则」,让用户自己维护要剔除的 class/id 关键词表
- 增加「导出为带 front-matter 的 Markdown」,直接适配静态博客
- 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具仅用于采集公开可见或你自身拥有权限的数据。
- 请遵守目标网站的服务条款、robots 协议及《网络安全法》等相关法律法规。
- 请合理控制请求频率,不要对目标站点造成访问压力。
- 不得用于采集个人隐私、付费墙内容或任何受法律保护的非公开数据。
- 因使用不当造成的后果由使用者自行承担;本工具不做数据二次分发。

