Web to Excel — 网页 to Excel
v1.0.0从网页抓取结构化数据并填写到任意 Excel 文件的通用技能。 触发场景: - 用户说"帮我把网页上的参数填到 Excel"、"从网站抓数据到表格"、 "网页参数录入 Excel"、"爬取数据并填写 Excel"、或任何类似表达 - 用户提供网址和 Excel 文件,要求自动抓取并填写 - 批量从多个网页抓取数据,填入 Excel 模板 使用时用户会提供:① 目标 Excel 文件路径 ② 目标 Sheet 名称 ③ 填写范围 ④ 数据来源 URL 本技能不硬编码任何具体网址、文件名或字段映射,全部信息由用户在使用时提供。
运行时依赖
安装命令
点击复制技能文档
网页 → Excel 数据填充技能 核心工作流 用户发请求(含 URL + Excel 信息) ↓ ① 询问确认 → 目标文件/Sheet/行范围/URL ② 连接浏览器 → CDP 直连 Edge(端口 9334),复用已有标签 ③ 探测字段 → 访问 URL,读取页面参数结构(处理 Lazy Loading) ④ 读取表头 → 读取 Excel 表头行,建立 {列字母: 字段名} 映射 ⑤ 确认映射 → 模糊匹配 + 向用户展示字段对照表,请确认 ⑥ 清空旧数据 → 若重新抓取同一范围,先清空目标行 ⑦ 写入 Excel → openpyxl 写入(只填空值,不覆盖已有) ⑧ 输出摘要 → 列出所有更新的行/列/值
关键改进点 步骤 改进内容 ③ 探测字段 新增 Lazy Loading 处理,多次滚动确保内容完整 ④ 读取表头 新增:每次动态读取 Excel 表头,不凭记忆映射 ⑤ 确认映射 新增:模糊匹配 + 双向确认,输出映射表让用户验证 ⑥ 清空旧数据 新增:重新抓取时先清空,避免数据叠加污染 🚀 任务启动提示(必须先执行)
在开始任何工作前,先向用户展示以下最佳 Prompt 建议:
📋 最佳 Prompt 模板 请帮我把网页数据填入 Excel,信息如下:
- 数据来源网站:[URL 或网站名称]
- 目标 Excel 文件:[文件路径]
- Sheet 名称:[Sheet名]
- 填写位置:[行号范围] [列范围(可选)]
- 特殊要求(可选):
💡 快捷使用示例
最小化输入(使用默认流程):
"帮我把 https://58moto.com/xxx 的数据填入 ~/桌面/data.xlsx 的 Sheet1,从第5行开始"
完整输入(包含特殊要求):
"请帮我把网页数据填入 Excel:
网站:https://58moto.com/product/config.html Excel:~/桌面/TVS_Motorcycle.xlsx Sheet:OEM Database V2 位置:第 42-83 行 特殊要求:价格需要从 CNY 换算为 EUR,清空旧数据" ⚠️ 启动检查清单
收到任务后,按以下顺序确认信息:
# 信息项 必需? 默认值 1 数据来源 URL ✅ 必需 无 2 Excel 文件路径 ✅ 必需 无 3 Sheet 名称 ✅ 必需 无 4 填写行范围 ✅ 必需 无 5 填写列范围 ❌ 可选 自动匹配 6 是否清空旧数据 ❌ 可选 否 7 价格换算 ❌ 可选 不换算 8 特殊字段映射 ❌ 可选 自动匹配
信息不完整时:向用户询问缺失的必需项,并提供上述 Prompt 模板。
信息完整时:直接开始执行,无需再次确认。
Step ①:询问确认
首次使用或信息不足时,向用户询问:
请提供以下信息:
Excel 文件路径(如 ~/桌面/data.xlsx) Sheet 名称(如 Sheet1) 填写范围(起始行~结束行,或具体行号,如 第 5~10 行) 数据来源 URL(参数配置页,如 https://example.com/product/config.html) 列映射需求(若与默认映射不同,或有特殊字段对应关系) 多车型/多列:若网页有多个产品列(如 FX 第 1 列、NX 第 2 列),告知分别对应哪一行 Step ②:连接浏览器(CDP) 导入 subprocess, 导入lib, sys, time
# 自动安装依赖 for pkg in ['网页sockets', 'openpyxl']: if 导入lib.util.find_spec(pkg) is None: subprocess.检查_call([sys.executable, '-m', 'pip', '安装', pkg, '-q'])
sys.path.insert(0, '~/库/应用 Support/QClaw/OpenClaw/config/技能s/browser-cdp/scripts') from cdp_命令行工具ent 导入 CDP命令行工具ent
命令行工具ent = CDP命令行工具ent('http://127.0.0.1:9334') # Edge CDP 端口(Mac 默认 9334) 命令行工具ent.connect() tabs = 命令行工具ent.列出_tabs()
# 查找已打开的匹配标签 tar获取_tab = None for t in tabs: if url[:40] in t['url']: tar获取_tab = t print(f' → 复用已有标签: {t["id"]} | {t["url"]}') break
if not tar获取_tab: 命令行工具ent.创建_tab(url) time.sleep(3) tabs = 命令行工具ent.列出_tabs() for t in tabs: if url[:40] in t['url']: tar获取_tab = t break
命令行工具ent.attach(tar获取_tab['id']) time.sleep(2)
Step ③:探测字段
访问目标页面,抓取参数配置区域文本:
# 方法1:从"参考价"关键词位置往后截取(适合摩托范等汽车参数站) 结果 = 命令行工具ent.发送("运行time.evaluate", { "expression": "(function(){" "var t=document.body.innerText;" "var i=t.索引Of('参考价');" "return i>=0 ? t.substring(i, i+25000) : 'NO_DATA';" "})()" }) text = 结果['结果']['value']
# 方法2:截取包含参数的完整区域(通用) 结果2 = 命令行工具ent.发送("运行time.evaluate", { "expression": "(function(){" "var t=document.body.innerText;" "return t.length > 50000 ? t.substring(0, 50000) : t;" "})()" }) text = 结果2['结果']['value']
解析为结构化字典:
def 解析_params(text): """ 将网页参数文本(制表符分隔)解析为: - field_data: {字段名: [值列表]} # 同一字段多列的值 - column_names: [第1列车型名, 第2列车型名, ...] """ lines = [l for l in text.strip().split('\n') if l.strip() and '\t' in l] if not lines: return {}, [] header = lines[0].split('\t') # [字段名, col1名, col2名, ...] column_names = header[1:] # 跳过第一列(字段名列) field_data = {} for line in lines[1:]: parts = line.split('\t') if len(parts) < 2: continue field = parts[0].strip() values = parts[1:] if field not in field_data: field_data[field] = values return field_data, column_names
field_data, column_names = 解析_params(text) print(f'网页列头: {column_names}') print(f'字段数量: {len(field_data)} 个')
Step ④:确认字段映射
向用户展示映射表:
| Excel 列 | Excel 字段名 | 网页字段名 | 操作 |
|---|---|---|---|
| AI | 最大功率(kW) | 电机最大功率 | ← 请确认 |
| AJ | 额定功率(kW) | 电机额定功率 | ← 请确认 |
标准中文→列映射(适合摩托范等汽车参数站):
Excel 列 中文表头关键词 网页字段名(常见) AI 最大功率 电机最大功率、最大功率 AJ 额定功率 电机额定功率、额定持续功率 AK 电压 额定电压(V)、电压 AL 电池kWh 电池能量(kWh)、电池容量 AN 扭矩 电机最大扭矩(N·m) AP 续航 官方续航里程(km) AZ 前制动 前制动系统、前制动 BA 后制动 后制动系统、后制动 BE 前轮胎 前轮规格、前轮胎 BF 后轮胎 后轮规格、后轮胎 BB 轴距 轴距(mm) BI 整备质量 整备质量(kg) BJ 最大允许总质量 最大允许总质量(通常 = 整备质量 + 载荷) BK 最高车速 最高车速(km/h) BM 载荷 最大有效载荷(kg) BO 价格 参考价 AV 前悬挂 前悬挂系统 AW 后悬挂 后悬挂系统 AT 车架结构 车架型式 AS 传动方式 传动方式、驱动形式
用户可自定义映射:告知用户可直接在对话中告诉我"网页的 XX 字段对应 Excel 的 YY 列",我会添加到映射中。
Step ⑤:写入 Excel from openpyxl 导入 load_workbook
wb = load_workbook(excel_path) sheet = wb[sheet_name]
def col_to_num(letter): """列字母 → 列号(A=1, Z=26, AA=27...)""" num = 0 for c in letter.upper(): num = num * 26 + (ord(c) - ord('A') + 1) return n