webclaw正文提取算法揭秘:Readability式评分+噪声过滤,如何从满屏广告里捞出正文
webclaw正文提取算法揭秘Readability式评分噪声过滤如何从满屏广告里捞出正文【免费下载链接】webclawFast, local-first web content extraction for LLMs. Scrape, crawl, extract structured data — all from Rust. CLI, REST API, and MCP server.项目地址: https://gitcode.com/gh_mirrors/web/webclawwebclaw 是一款用 Rust 编写的本地优先网页正文提取工具专为 LLM 场景设计一条命令把任意网页变成干净的 Markdown 或结构化数据。它最核心的能力就是在一堆导航栏、广告位、Cookie 弹窗的干扰下精准捞出正文。这篇文章带你拆解它的正文提取算法一套 Readability 式的候选节点评分机制外加一层多层噪声过滤两者配合让 LLM 拿到的是内容而不是杂音。为什么正文提取这么难 把网页喂给大模型之前大多数工具只能给你两种糟糕的结果一个登录墙、验证页或空壳页面一大坨原始 HTML塞满了nav、script、广告和重复的样板代码。正文本身并没有标签。同一个div里今天装着文章内容明天可能装着评论区。所以提取器必须靠启发式打分来判断哪块区域最像正文。webclaw 的思路与经典的 Readability 一脉相承先过滤噪声再给候选区域打分最后把胜者转成 Markdown。webclaw 正文提取算法四步走整套流程的入口在 extractor.rs 的extract_content函数核心逻辑分四步。第一步噪声过滤把明显不是内容的先扔了过滤规则集中在 noise.rs按四个维度识别噪声元素维度匹配方式典型例子标签精确匹配script、nav、aside、footer、iframe、svgARIA 角色精确匹配rolenavigation、rolebanner、rolecontentinfoclass精确 token 匹配ad、sidebar、modal、cookie、newsletterid精确 前缀匹配comments、related、onetrust、gdpr、cookiebot这里有几个值得注意的细节精确 token 匹配代替子串匹配classmodal算噪声但classfree-modal-container不算——避免把某个站点的正文容器误杀noise.rs。专门狙击 Cookie 同意平台OneTrust、Cookiebot、Osano 这类平台会生成遮罩整个页面的 DOMwebclaw 维护了一份 ID 前缀黑名单直接整体剥离noise.rs。form的启发式ASP.NET 常把整个页面包在一个form里而登录框又是小form。webclaw 的判定很简单文本超过 500 字符的 form 视为页面容器短小的登录/搜索/订阅表单才是噪声noise.rs。安全阀HTML 闭合不规范时未闭合的header可能吞掉整页内容。所以如果某个被标记为噪声的元素文本超过 5000 字符会被判定为破损的包裹层转而当作内容保留noise.rs。第二步Readability 式评分给候选区域打分过滤完噪声后提取器用选择器article, main, [rolemain], div, section, td圈出所有候选节点逐个打分extractor.rs。打分规则非常透明score_node门槛文本不足 50 字符的节点直接 0 分——正文不可能那么短基础分 ln(文本长度)取对数防止超长节点纯靠块头取胜语义加分 50标签是article、main或rolemain是正文的强信号命名加分 25class 或 id 里含content、article、post、entry等词段落密度加分每有一个p加 3 分——真正的文章由段落组成链接密度扣分这是区分正文和导航/页脚的关键。普通div里链接文字占比超过 50% 分数直接乘 0.1超过 30% 乘 0.5而语义节点article/main惩罚更轻因为文档站目录里本来就链接多。分数最高的节点胜出其余候选全部出局。第三步兜底策略宁要全量不要空白如果评分没选出任何强候选例如页面没有语义化标签webclaw 不会返回空而是退回到body整体转换再由噪声过滤器在输出时做二次清理——评分和过滤双保险extractor.rs。第四步质量检查识别假正文捞出的内容还要过一道质量检查quality.rs标题是 Just a moment、Access denied或正文写着 Please enable JavaScript会被标记为验证拦截标题是 Sign in 则标记为需要登录没有任何字母数字则标记为空内容。这一步让上层调用方能明确知道没提取到的真正原因而不是拿到一个莫名其妙的短文本。亲手试试三条命令行感受一下提取效果# 完整模式噪声过滤 评分 webclaw https://example.com --format markdown # 只要 article/main跳过评分 webclaw https://example.com/blog/post --only-main-content # 自己指定包含/排除规则覆盖默认启发式 webclaw https://example.com --include article, main --exclude nav, footer, .ad--exclude参数直接对应第一步的排除集构建逻辑extractor.rs最多接受 100 条 CSS 选择器命中的元素连同所有后代一起剔除。小结webclaw 的正文提取算法没有魔法靠的是工程上的扎实噪声过滤标签、角色、class、id 四维识别加 Cookie 平台黑名单、form启发式与破损包裹层安全阀把误杀率压到很低Readability 式评分对数长度 语义标签 50 段落密度 链接密度惩罚规则简单且每个分值可解释兜底与质检评分失败退回 body输出前识别验证页/登录墙/空页保证 LLM 拿到的上下文干净且失败有原因。如果你想深入源码建议按这个顺序阅读noise.rs 的过滤规则 → extractor.rs 的评分函数 → quality.rs 的质量检查三者的职责边界非常清晰是学习正文提取算法的好范本。【免费下载链接】webclawFast, local-first web content extraction for LLMs. Scrape, crawl, extract structured data — all from Rust. CLI, REST API, and MCP server.项目地址: https://gitcode.com/gh_mirrors/web/webclaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考