剪藏文章总混进广告导航?Defuddle 免费把网页正文提取成干净 Markdown
【免费下载链接】defuddleGet the main content of any page as Markdown.项目地址: https://gitcode.com/gh_mirrors/de/defuddle
把网页正文搬进笔记软件,评论区、侧边栏、订阅按钮却跟着一起进来?Defuddle 干的就是网页正文提取这件事:找到主内容,清掉杂项,转成干净的 Markdown 或 HTML。
它替你解决哪几件事
你想把一篇博客存进笔记库,直接 Ctrl+C 却把"相关文章"和分享按钮全带了进来。Defuddle 用打分算法挑出得分最高的正文区块,广告、导航、评论区按名单清掉,你得到的是能直接落库的 Markdown。
手上有一份论文或博客 URL 列表要批量归档。逐条喂给它的命令行,输出正文外加标题、作者、发布日期等元数据,你得到一摞格式统一的 .md 文件,不用再手写解析。
你在搭内容管道,需要稳定的正文和字段喂给下游。该工具返回title、author、published、wordCount、schema.org 数据等完整字段,你不用为每个站点单独写特判。
最快跑起来:一条 npx 命令
# 无需安装,直接跑;正文转 Markdown 后存到文件 npx defuddle parse https://example.com/article --markdown --output article.md不想碰终端也可以把它当库引入:浏览器里new Defuddle(document).parse(),Node.js 里用defuddle/node入口搭配 linkedom 或 JSDOM,核心 / full / node 三个 bundle 按场景选。
三个核心能力
1. 正文定位靠打分,而不是选择器猜
它给每个候选区块打分:文本密度、链接密度、语义标签,甚至参考页面移动端视口下的样式,得分最高的成为正文,而且拿不准的宁可少删。
const result = new Defuddle(document, { debug: true }).parse(); result.debug.contentSelector // 最终选中的正文选择器对你意味着:换一批网站不用改代码;提取错了也能看到它到底选了哪一块。
2. 清理有清单,删了什么可追溯
除了打分删低分块,它还按名单删除广告、社交分享按钮、CSS 隐藏元素和小图标、跟踪像素,移除逻辑集中在 src/removals/ 目录。
result.debug.removals // 每块被删内容的原因,如 score: -20、display:none对你意味着:删多了删少了都能对账,不是黑盒 🧹
3. 转 Markdown 前,先统一格式
代码块去行号但保留语言标记,KaTeX / MathJax 公式转成标准 MathML,各种脚注写法和 callout 提示框也归一成统一格式,规则在 src/elements/。
<pre><code>import { parseHTML } from 'linkedom'; import { Defuddle } from 'defuddle/node'; const url = 'https://example.com/article'; const html = await fetch(url).then((r) => r.text()); const { document } = parseHTML(html); // markdown 输出 Markdown;出问题时看 debug 里的选择器和删除记录 const result = await Defuddle(document, url, { markdown: true, debug: true }); console.log(result.title, result.author, result.published); console.log(result.content); // 干净的正文 Markdown终端里等价的一条命令是npx defuddle parse "$url" --frontmatter -o out.md,--frontmatter会把标题、作者、来源写成 YAML 头部。
配置速查表(库模式常用项)
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
markdown | boolean | false | 把content转成 Markdown 输出 |
contentSelector | string | - | 手动指定正文选择器,跳过自动定位 |
standardize | boolean | true | 标准化脚注、代码块、公式等元素 |
removeSmallImages | boolean | true | 移除图标、跟踪像素等小图 |
useAsync | boolean | true | 允许异步提取器回源抓取,给 SPA 页面兜底 |
debug | boolean | false | 返回正文选择器、删除记录等调试信息 |
踩坑 & 进阶:群里老手的几条
- 某些站点直接 403?默认 UA 被拒是常态,
--user-agent传个真实浏览器 UA 基本就通了。 - 页面是客户端渲染,HTML 里根本没正文?默认开启的
useAsync会让站点提取器去第三方接口兜底,Reddit、YouTube 这类都有专门处理,见 src/extractors/;纯离线环境就关掉它,别傻等外网。 - 感觉删多了或删少了?拿管道开关逐个排查:
removeLowScoring: false跳过打分删除,removeHiddenElements: false保留 CSS 隐藏块——有些博客的 sidenote 就是用display:none装的,不动它正文反而不完整。 contentSelector配了却没生效?选择器匹配不到元素时会静默回退到自动定位,开着 debug 看debug.contentSelector和debug.errors就知道走没走通。- Node 里 import 就报错?
defuddle/node要求package.json里写"type": "module",linkedom 和 JSDOM 两种 DOM 实现都能接。
Defuddle 的定位其实很窄:把网页正文提取成干净的 Markdown(或 HTML),少删、稳输出,别的它不管。tests/fixtures目录里有一百多个真实页面用例和预期输出,遇到拿不准的版式,翻一翻就知道它对这类布局的处理思路。
【免费下载链接】defuddleGet the main content of any page as Markdown.项目地址: https://gitcode.com/gh_mirrors/de/defuddle
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考