做技术这一行,谁没经历过这种时刻:网页上明明白白摆着一张数据很规整的表格,可你要用它,就只能在Excel窗口和浏览器之间来回切换,手动一行一行复制粘贴。遇到带样式的、带合并单元格的、带分页的,复制过来全乱套,还得花时间重新排版。我做数据整理类的项目比较多,几乎每周都要被这种事磨掉一两个小时,后来实在忍不了了,就把这个需求做成一个AI Agent的Skill——给它一个网址,它能自己去理解网页结构、提取表格数据、整理成CSV或Excel直接输出,拿到手的文件还能继续编辑。今天不绕弯子,把整个Skill的设计思路、核心代码、踩坑记录都摊开讲。不管你是做运营、搞数据分析、写爬虫脚本,还是想给自己手头的AI工具加个实用技能,这篇都值得看完。
1. 先搞清楚:这个Skill到底解决什么问题
1.1 网页数据采集的三个传统痛点
先说一个很现实的问题:为什么大家天天跟网页打交道,却很少人能高效地把网页数据变成自己手里的表格?
痛点一是复制粘贴的低效。表格短还好办,一旦超过一屏,浏览器选中区域、Excel定位单元格、格式对齐,每一步都是时间黑洞。更麻烦的是,不少网页表格里嵌着链接、图片、按钮,复制过来要么丢了内容,要么混进一堆HTML标签。
痛点二是隐藏结构看不懂。你以为网页上那个表格就是个table标签?真去做过采集的人都知道,现在很多前端框架渲染出来的页面,表格是div套div,甚至数据是藏在JavaScript变量或者接口返回的JSON里,肉眼看着是表格,源码里根本没有table。手工复制根本拿不到干净数据。
痛点三是格式和编码的混乱。从网页复制到Excel,日期变数字、百分号变文本、换行符把单元格撑破、中文乱码……这些问题几乎每个手工整理过数据的人都撞到过,但很少有人系统性想过怎么解决。
这个Skill要解决的,就是把这三点一次性打包处理掉:自动识别网页里的表格式内容,提取成结构化数据,再输出成真正能编辑的表格文件。
1.2 Skill和普通爬虫脚本到底有什么区别
先解释一下这里的Skill是什么。如果你用过Claude Code、Codex这类AI编码工具,应该对Skill不陌生。简单说,Skill就是一套写给AI Agent看的操作手册加工具集,它告诉Agent:"当你遇到某类任务时,按这套流程、用这些工具、按这个输出规范去完成。"
那它和传统写一段Python爬虫脚本有什么区别?区别在于能不能对话、能不能应变。
传统爬虫脚本是写死的:你告诉它URL规则、CSS选择器、翻页逻辑,它按步执行。一旦目标网页改版,脚本就废了。而Skill给AI Agent的是"能力"而不是"路径"——你把"理解网页结构、定位数据、输出表格"这几个步骤的目标和规范告诉它,AI在执行时会根据具体页面的实际情况调整策略,遇到div布局它会自己分析层级,遇到接口返回的数据它会顺着请求去挖。改版影响小,适应面广很多。
另一个区别是交付形态。脚本的输出通常是"数据文件";Skill的输出可以是"数据文件+对话式反馈"。比如它抓完数据会告诉你:"这个页面有10列,其中第3列是图片链接,我默认忽略了,如果你需要可以加参数保留。"这种可交互的形态,在真实工作中比闷头出一个文件要友好得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 网页数据变表格:核心原理拆解
2.1 网页里那些"表格"到底长什么样
要从网页里提取表格,首先得知道目标长什么样。我归纳下来,网页里的表格数据大致有四类形态,识别策略完全不同。
第一类是标准的HTML Table标签,也就是<table><tr><th><td>这套结构。这是最理想的情况,因为语义清楚,列头、行数据、合并单元格都有明确的标签表达,解析难度最低。早年的政府网站、学校官网、新闻网站大量使用这种结构。
第二类是CSS渲染的"假表格"。前端用div+class模拟表格样式,最常见的class命名就是table、row、col、grid之类。肉眼看着是表格,但源码里没有table标签。这种需要结合class名称、布局规律来判断哪些div组合在一起构成一行。
第三类是隐藏在数据层里的表格。很多页面是后端接口返回JSON,前端渲染成表格。打开网页源代码看不到任何数据,数据全在XHR请求的响应里。这类反而是最好处理的——直接找到数据接口,拿到的就是结构化JSON,转成表格几乎是零损耗。
第四类是"混合型"页面。比如页面主体用接口数据渲染,但某个角落的汇总信息是写死在HTML里的;或者表格数据分成多页,每页的URL带不同参数。最麻烦,需要分步处理。
2.2 三种数据识别策略,按优先级排
我在Skill里设计了三条路线,按优先级走,走不通再降级。
首先是结构直取。检测页面里的<table>标签,用解析库把所有表格全部提取出来,每个表格保留行列信息。遇到合并单元格,把rowspan和colspan属性展开成重复单元格,保证输出后行列对齐。
其次是启发式识别。没有table标签时,根据class名和DOM结构找"长得像表格"的区域。判断依据包括:是否存在规律重复的子节点、子节点的数量是否一致、是否有表头样式的差异化class(比如header、th这种词)。这个方法不保证100%准确,但能覆盖大部分div表格。
最后是接口追踪。如果页面是典型的
