影刀RPA 网页表格采集进阶:合并单元格处理
影刀RPA 网页表格采集进阶合并单元格处理作者林焱什么情况用什么采集网页表格时遇到合并单元格——表头跨了两列、某个分类名占了三行——直接按行遍历会导致数据错位。在影刀RPA里需要先解析表格结构还原合并单元格的值再按行列提取数据。适用场景采集带合并表头的报表、财务表格的合并分类行、排班表的跨行单元格、带层级结构的表格数据。怎么做基础表格采集简单表格直接用影刀【提取网页数据表格】或pandas读取拼多多店群自动化报活动上架importpandasaspd# 方式1pandas直接读取HTML表格tablespd.read_html(https://example.com/report)dftables[0]# 取第一个表格# 方式2影刀【提取网页数据表格】指令# 在影刀中直接用可视化指令提取适合标准表格合并单元格处理frombs4importBeautifulSoupimportrequestsdefextract_table_with_merged_cells(html,table_index0):提取带合并单元格的表格soupBeautifulSoup(html,html.parser)tablesoup.find_all(table)[table_index]rowstable.find_all(tr)ifnotrows:return[]# 1. 计算表格实际列数考虑colspanmax_cols0forrowinrows:cols0forcellinrow.find_all([td,th]):colspanint(cell.get(colspan,1))colscolspan max_colsmax(max_cols,cols)# 2. 初始化数据矩阵num_rowslen(rows)num_colsmax_cols data[[None]*num_colsfor_inrange(num_rows)]# 3. 填充数据处理rowspan和colspanforr,rowinenumerate(rows):cellsrow.find_all([td,th])col_idx0forcellincells:# 跳过已被rowspan占用的位置whilecol_idxnum_colsanddata[r][col_idx]isnotNone:col_idx1ifcol_idxnum_cols:breaktextcell.get_text(stripTrue)colspanint(cell.get(colspan,1))rowspanint(cell.get(rowspan,1))# 填充当前及合并的列forcinrange(colspan):ifcol_idxcnum_cols:data[r][col_idxc]text# 填充rowspan占用的行forr_offinrange(1,rowspan):ifrr_offnum_rows:forcinrange(colspan):ifcol_idxcnum_cols:data[rr_off][col_idxc]text col_idxcolspan# 4. 转为DataFramedfpd.DataFrame(data[1:],columnsdata[0])# 第一行作为表头returndf# 使用urlhttps://example.com/sales_reportresponserequests.get(url,timeout10)dfextract_table_with_merged_cells(response.text,table_index0)df.to_excel(rC:\Data\table_data.xlsx,indexFalse)影刀RPA中的操作流程1. 【打开网页】→ 打开目标报表页面 2. 【执行Python代码】→ 获取页面HTML 3. 【执行Python代码】→ 解析合并单元格表格 4. 【写入Excel文件】→ 保存数据 5. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8f1c1666cd15454a8749e60ed924ad80.png#pic_center) 6. 【翻页处理】→ 如果有分页循环1-4在影刀中的Python代码节点# 获取当前页面HTML# 方式1用影刀【获取网页源代码】指令获取html存到变量# 方式2直接用requestsimportrequestsfrombs4importBeautifulSoupimportpandasaspd urlhttps://example.com/report?page1headers{User-Agent:Mozilla/5.0...}responserequests.get(url,headersheaders,timeout10)dfextract_table_with_merged_cells(response.text)# 通过yd_var传递给影刀yd_var[table_data]df.to_dict(records)yd_var[row_count]len(df)多页表格合并采集defscrape_multi_page_table(base_url,max_pages10):采集多页表格数据all_data[]forpageinrange(1,max_pages1):urlf{base_url}?page{page}responserequests.get(url,headersheaders,timeout10)dfextract_table_with_merged_cells(response.text)ifdf.empty:print(f第{page}页无数据停止)breakall_data.append(df)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4d47cc3155c841fdb7b7fcd233e88c3c.png#pic_center)print(f第{page}页采集{len(df)}行)# 影刀中可用【等待元素出现】检查是否有下一页按钮# 如果没有下一页则break# 合并所有页resultpd.concat(all_data,ignore_indexTrue)returnresult# 使用resultscrape_multi_page_table(https://example.com/report,max_pages20)result.to_excel(rC:\Data\all_pages.xlsx,indexFalse)有什么坑坑1表头多行合并导致列名丢失有些表格表头有2-3行第一行是分类合并单元格第二行才是具体列名# 问题pandas.read_html默认只取第一行做表头dfpd.read_html(html)[0]# 列名是分类名而不是具体字段名# 解决指定header行dfpd.read_html(html,header1)[0]# 用第二行做表头![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/463ec3449c0344968e0f8e984a9fdc0d.png#pic_center)# 或者自定义表头dfpd.read_html(html,headerNone)[0]df.columns[日期,地区,产品,数量,金额]# 手动指定坑2rowspan导致数据错位一个单元格rowspan3占了3行但后面的行少了一个td直接遍历td会错位TEMU店群矩阵自动化运营核价报活动# 问题直接遍历td数量不一致forrowinrows:cellsrow.find_all(td)# 第一行5个td第二行可能只有4个因为被上面的rowspan占了![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/312ed171dd3f44648e7ca2dcac3e834b.png#pic_center)# 解决用上面的矩阵填充法先初始化空矩阵# 然后跳过已被占用的位置# 参见上面的extract_table_with_merged_cells函数坑3表格在iframe里# 问题requests获取的HTML里没有表格因为表格在iframe里responserequests.get(url)# response.text里找不到table# 解决先找到iframe的src再请求iframe的URLsoupBeautifulSoup(response.text,html.parser)iframesoup.find(iframe)ififrame:iframe_urliframe.get(src)ifnotiframe_url.startswith(http):iframe_urlrequests.compat.urljoin(url,iframe_url)iframe_responserequests.get(iframe_url,headersheaders)# 在iframe_response.text里找表格坑4动态加载的表格表格数据通过AJAX加载requests获取的HTML是空的# 解决1找到AJAX接口直接请求# 在浏览器F12 → Network → XHR中找到数据接口api_urlhttps://example.com/api/table_data?page1responserequests.get(api_url,headersheaders)dataresponse.json()dfpd.DataFrame(data[rows])# 解决2用影刀的浏览器自动化# 【打开网页】→ 【等待元素出现】表格 → 【获取网页源代码】→ 解析坑5表格内嵌格式干扰单元格里有、等标签导致文本混乱# 问题get_text()把所有文字连在一起没有分隔cell.get_text()# 张三经理13800138000# 解决用分隔符cell.get_text(separator ,stripTrue)# 张三 经理 13800138000# 或者更精细地提取forbrincell.find_all(br):br.replace_with(\n)textcell.get_text(stripTrue)# 张三\n经理\n13800138000

相关新闻

商场裸眼3D互动开发:3ds Max与Unity全流程实战指南

商场裸眼3D互动开发:3ds Max与Unity全流程实战指南

1. 项目概述:商场大屏裸眼3D互动到底是什么? 最近几年,如果你逛过一些大型商场或者商业综合体,大概率会看到一些让人眼前一亮的“黑科技”。比如,一块巨大的LED屏幕上,一条鲸鱼仿佛要冲破屏幕,向…

2026/7/23 8:37:15 阅读更多 →
肌电数据处理实战05:真实髋伸展训练sEMG的多肌肉协同分析

肌电数据处理实战05:真实髋伸展训练sEMG的多肌肉协同分析

前 4 个案例已经完成了肌电入门中非常重要的几步:从最基础的公开 EMG 读取、滤波、整流、包络,到活动段检测、时频图、机器学习分类,再到真实手部抓握数据中的双通道协同和重复动作趋势分析。到了第 5 个案例,我们继续往前走一步:不再只看一条肌电信号,也不只比较几个孤立…

2026/7/23 8:37:15 阅读更多 →
嵌入式驱动开发实战:SysTick、Timer与UART核心原理与TI ROM库应用

嵌入式驱动开发实战:SysTick、Timer与UART核心原理与TI ROM库应用

1. 嵌入式外设驱动开发的核心价值与挑战在嵌入式开发这个行当里摸爬滚打了十几年,我越来越觉得,能把芯片数据手册上那些冷冰冰的寄存器描述,变成一行行稳定、高效、可维护的驱动代码,是区分“码农”和“工程师”的一道分水岭。很多…

2026/7/23 8:37:15 阅读更多 →

最新新闻

TMS470R1Vx外设深度解析:DMA、MibSPI与时钟系统实战指南

TMS470R1Vx外设深度解析:DMA、MibSPI与时钟系统实战指南

1. 项目概述:深入TMS470R1Vx的硬件世界在嵌入式开发的江湖里,选对微控制器只是第一步,真正决定项目成败的,往往是那些隐藏在芯片内部、负责具体脏活累活的外设模块。今天,我们就来深挖一款在工业控制和汽车电子领域颇有…

2026/7/23 9:15:31 阅读更多 →
柠檬质检检测数据集VOC+YOLO格式1767张2类别

柠檬质检检测数据集VOC+YOLO格式1767张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1767标注数量(xml文件个数):1767标注数量(txt文件个数):1767标注类别…

2026/7/23 9:15:31 阅读更多 →
【软工作业思考】关于软工的一些概念性理解暨第一次阅读

【软工作业思考】关于软工的一些概念性理解暨第一次阅读

概述 项目 内容 本次作业所属课程 2019BUAA软件工程 周二班 本次作业要求 第1次个人作业 当然,比这个更重要百倍的还是实实在在的思考,这也是标题如此命名的原因 我在本课程的目标 在原有实践经验的基础上,系统化学习软工领域的理论知识&…

2026/7/23 9:15:31 阅读更多 →
OpenAI自曝:一周前入侵Hugging Face的,是自家测试中的AI模型!

OpenAI自曝:一周前入侵Hugging Face的,是自家测试中的AI模型!

编译 | 屠敏 出品 | CSDN(ID:CSDNnews) 在 Hugging Face 披露遭遇自主 AI Agent 入侵一周后,OpenAI 于今天最新发布一份调查说明,首次确认上周入侵 Hugging Face 生产环境的自主 AI Agent,是由多款 OpenAI …

2026/7/23 9:14:31 阅读更多 →
QMT与PTrade日志路径迁移:用pathlib去掉Windows硬编码

QMT与PTrade日志路径迁移:用pathlib去掉Windows硬编码

2026年主流量化软件对比进入代码迁移时,日志路径是常见故障点。牛股王股票适合普通投资者通过策略、回测、盯盘和提醒完成规则化跟踪;QMT适合核对开户券商本地终端的运行目录、权限与账户;PTrade适合核对券商侧云端任务的工作目录、日志和权限…

2026/7/23 9:14:31 阅读更多 →
券商量化终端缺少模块:用Python探针记录解释器和依赖版本

券商量化终端缺少模块:用Python探针记录解释器和依赖版本

2026年主流量化软件对比进入开发环境时,最实用的动作是先记录解释器、操作系统和模块可用性。牛股王股票适合希望通过可见条件完成策略、回测和提醒的普通投资者;QMT适合核对开户券商提供的本地终端、Python环境与账户链路;PTrade适合核对券商…

2026/7/23 9:14:31 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻