1. 网页正文提取为什么总是不干净
做数据采集和知识库构建的朋友大概率都遇到过这种情况:用爬虫把网页 HTML 抓下来,满心欢喜地丢给模型做摘要,结果模型一本正经地总结了一堆“点击领取优惠券”“相关阅读:xxx”“版权所有”之类的内容。正文没提多少,广告和导航倒是抓得挺全。
这个问题的根源在于,现代网页早就不是一篇干净的文章了。一个典型的新闻详情页,正文可能只占整个 HTML 的 20%,剩下的 80% 是顶部导航、侧边广告、内嵌推广、底部推荐、评论区、版权声明。传统的正则匹配和简单 DOM 规则,面对千变万化的 class 命名和嵌套结构,基本是按下葫芦浮起瓢——这个站调好了,换个站又失效。
OpenClaw 的 content-extract 技能就是冲着这个痛点来的。它把网页当成一个视觉+语义的整体来理解,而不是死抠标签。它能判断哪块区域是“大段连贯文字”,哪块是“高链接密度的导航”,哪块是“带促销词的广告”,最终输出一份干净的 Markdown。适合谁用?做舆情监控的、搭个人知识库的、给大模型准备训练数据的,以及任何需要把网页变成可读文本的人。
但这里有个现实问题:content-extract 这类技能背后要调用模型做视觉和语义分析,你得有个稳定的模型 API 通道。如果每个技能都单独配一套 Key,管理起来很麻烦。这篇就讲怎么用 TaoToken 统一 Key 把这条链路打通,从配置到验证一次跑通。
2. TaoToken 统一 Key 的前置准备
在动手配 OpenClaw 之前,先把模型调用通道准备好。TaoToken 在这里扮演的角色是统一的 API 入口——你不需要为每个模型或每个技能单独申请不同的 Key,一个 Key 就能覆盖 content-extract 背后需要的模型调用。
先注册并拿到 API Key。访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 完成账号注册,然后进控制台创建 Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在 API Keys 页面点创建,复制生成的 Key 保存好。API Keys 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,后续要加白名单或换 Key 都从这里进。
TaoToken 的 API 基础地址是 https://taotoken.net/api ,注意这个地址不带 UTM 参数,配置里直接写这个就行。它兼容常见的 OpenAI 风格调用格式,所以 OpenClaw 里配置 base_url 和 api_key 就能接上。
注意:API Key 不要硬编码在会提交到 Git 的配置文件里。建议用环境变量注入,或者放在本地不纳入版本管理的 .env 文件中。
如果你还没想好 content-extract 具体用哪个模型,可以先到模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 试一下不同模型对网页文本的理解效果,挑一个在中文语义和长文本上表现稳定的。选好之后,把模型名称记下来,下一步写进 config.toml。
3. OpenClaw content-extract 的 config.toml 骨架
OpenClaw 的技能配置走 config.toml 文件。下面这份骨架是我实测下来比较稳的结构,你可以直接复制后改 Key 和模型名。核心思路是把模型调用统一指向 TaoToken 的 API 地址,content-extract 技能只负责提取逻辑,模型通道交给 TaoToken。
# ~/.openclaw/config.toml [llm] # 统一走 TaoToken 的 API 通道 provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" # 从环境变量读取,别写死 model = "gpt-4o-mini" # 换成你在模型对话里选定的模型 timeout = 60 max_retries = 3 [skills.content-extract] enabled = true # 输出格式固定为 markdown output_format = "markdown" # 是否保留正文中的图片 include_images = false # 是否保留超链接 include_links = true # 显式排除的 CSS 选择器,按站点补充 exclude_selectors = [ ".ad", ".ads", ".advertisement", "#sidebar", ".sidebar", ".comments", "#comments", ".related-posts", ".recommend" ] # 显式指定正文容器,命中则优先使用,提升精度和速度 include_selectors = [ "article", "main", ".article-content", ".post-content", ".entry-content" ] # 页面语言,帮助语义模型判断 language = "zh" # 单次提取最大字符数,防止超长页面拖慢 max_length = 20000 [skills.content-extract.render] # 是否启用 JS 渲染,动态页面需要 enable_js = true # 渲染等待时间(毫秒) wait_ms = 1500几个参数值得单独说。base_url指向 TaoToken 的 API 地址后,OpenClaw 所有走 llm 段的技能都会用这个通道,不用每个技能单独配。exclude_selectors和include_selectors是提升提取质量的关键——前者屏蔽已知噪音,后者锁定正文区域。enable_js打开后能处理动态加载的页面,但会慢一些,静态页面可以关掉。
配置写完后,把 API Key 注入环境变量:
export TAOTOKEN_API_KEY="你的Key"Windows 下用set TAOTOKEN_API_KEY=你的Key,或者写进系统环境变量。确认环境变量生效:
echo $TAOTOKEN_API_KEY能打印出 Key 就说明注入成功。这一步别跳过,很多人配置不生效就是因为环境变量没读到。
4. 端到端验证:从 URL 到干净 Markdown
配置就绪后,跑一次完整的提取验证。OpenClaw 的 content-extract 可以通过 CLI 调用,也可以走 Python SDK。先用 CLI 快速验证通道是否通。
openclaw skill run content-extract \ --url "https://example.com/news/article-123" \ --output result.md如果配置正确,命令会输出提取进度,最后在当前目录生成 result.md。打开看看内容——正常情况下,导航栏、侧边广告、底部推荐、评论区都应该被过滤掉,只剩下标题和正文段落,格式是标准 Markdown。
想更细粒度地控制,用 Python SDK 调用:
import os from openclaw import OpenClawClient client = OpenClawClient( base_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"] ) result = client.skills.extract( skill="content-extract", url="https://example.com/news/article-123", options={ "format": "markdown", "include_images": False, "exclude_selectors": [".ad", ".comments", "#sidebar"], "language": "zh" } ) print(result.content)跑通后,result.content就是干净的 Markdown 正文。我试过拿一个结构很乱的科技新闻页做对比:原始 HTML 里正文只占一小块,周围全是推广和推荐,提取后输出的 Markdown 只有标题和四段正文,广告和推荐一条没带进来。
验证成功的标志有三个:一是输出是合法 Markdown,标题层级正确;二是正文段落完整,没有被截断;三是广告、导航、评论区的文字没有混进来。如果这三点都满足,说明 TaoToken 通道和 content-extract 技能已经打通。
5. 本篇常见错误排查
配置和调用过程中,有几个坑出现频率特别高,提前列出来省得你踩。
报 401 或鉴权失败:八成是 API Key 没读到。先确认echo $TAOTOKEN_API_KEY有输出,再检查 config.toml 里写的是${TAOTOKEN_API_KEY}而不是硬编码的空字符串。如果 Key 本身没问题,去 API Keys 页面确认这个 Key 没有被禁用或删除。
提取结果为空或只有标题:通常是include_selectors命中了但容器里没内容,或者max_length设太小把正文截没了。先把include_selectors清空,让技能走全页智能识别;同时把max_length调到 50000 试一次。如果还不行,检查页面是不是需要登录才能看到正文。
广告没过滤干净:自动识别对某些伪装成正文的推广块可能失效。这时候用exclude_selectors手动补刀。打开浏览器开发者工具,找到广告块的 class 或 id,加进排除列表。比如某站的推广块是<div class="promo-box">,就加.promo-box。
动态内容抓不到:确认enable_js = true且wait_ms足够长。有些页面加载慢,1500 毫秒不够,调到 3000。如果还是不行,说明页面交互复杂(比如要点击“展开全文”),这种情况先用 Playwright 拿到渲染后的 HTML,再通过html参数传给 content-extract,绕过页面获取环节。
调用超时:长页面加 JS 渲染容易超时。把timeout从 60 调到 120,同时确认 TaoToken 通道本身没有限流。如果批量提取,控制并发数,别一次性发太多请求。
中文乱码:language设成zh,并确认传入的 HTML 是 UTF-8 编码。如果是从其他工具拿到的 HTML,先做一次编码转换再传。
排查顺序建议从鉴权开始,再到选择器,最后到渲染参数。大部分问题集中在前两步。
6. 把这条链路用起来
content-extract 加 TaoToken 统一 Key 的组合,本质上解决的是“网页到干净文本”这一段脏活。提取出来的 Markdown 可以直接进知识库、喂给摘要模型、或者作为训练数据预处理的一环。
如果你后面要做长期的编码或 Agent 任务,比如批量处理成千上万个页面、把提取结果自动入库,可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它在调用配额和并发上更适合持续跑的任务。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的参数说明和示例,遇到配置细节可以对照查。
实际用的时候有个小技巧:把exclude_selectors按站点维护成不同的配置文件,提取前根据域名加载对应的排除规则。这样通用识别兜底,站点规则补刀,提取纯净度会明显上一个台阶。另外,提取结果建议加一层缓存,相同 URL 短期内不重复调用,既省配额又快。