影刀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/11/6 19:33:30 阅读更多 →
肌电数据处理实战05:真实髋伸展训练sEMG的多肌肉协同分析

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

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

2026/11/6 3:05:58 阅读更多 →
嵌入式驱动开发实战:SysTick、Timer与UART核心原理与TI ROM库应用

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

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

2026/11/13 16:44:38 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻