影刀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

相关新闻

最新新闻

毕设 基于大数据的游数据分析可视化系统(源码分享)

毕设 基于大数据的游数据分析可视化系统(源码分享)

文章目录 0 简介1 课题背景2 数据处理3 数据可视化工具3.1 django框架介绍3.2 ECharts 4 Django使用echarts进行可视化展示(mysql数据库)4.1 修改setting.py连接mysql数据库4.2 导入数据4.3 使用echarts可视化展示 5 实现效果5.1前端展示5.2 后端展示 最…

2026/7/23 9:19:28
空口演进与范式重构:2026年6G技术进展深度透视

空口演进与范式重构:2026年6G技术进展深度透视

2026年,全球移动通信产业正处于一个历史的“换轨期”。如果说5G-Advanced(5.5G)是对现有网络能力的极限压榨,那么6G则是对物理世界与数字世界交互方式的根本性重构。截止到2026年中,6G技术已完全褪去“愿景研究”的朦胧…

2026/7/23 9:19:28
19.7%年复合增长的边缘AI部署平台,为什么是2026年B端数字化的必争赛道

19.7%年复合增长的边缘AI部署平台,为什么是2026年B端数字化的必争赛道

各位CTO、产业数字化负责人、AI创业者、投资人,今天我们抛开云厂商的概念营销,从30年产业落地的真实视角,把边缘AI部署平台的商业逻辑、落地痛点和红利机会讲透——这不是靠云资源堆砌出来的伪需求,而是接下来7年能跑出近7000亿规…

2026/7/23 9:19:28
十、Redis之布隆过滤器

十、Redis之布隆过滤器

文章目录布隆过滤器是什么?布隆过滤器能干什么?布隆过滤器原理hash冲突布隆过滤器使用添加坑位判断是否存在布隆过滤器使用场景解决缓存穿透的问题,和redis结合bitmap使用黑名单校验,识别垃圾邮件案例布隆过滤器优缺点布隆过滤器是…

2026/7/23 9:19:28
Duix-Avatar 深度测评:13.6K Star 开源数字人,表现到底如何?

Duix-Avatar 深度测评:13.6K Star 开源数字人,表现到底如何?

T2 深度测评 工具类 2025 GitHub: https://github.com/GuijiAI/duix.ai ⭐ 13.6k 许可证:Apache-2.0 语言:Python / JavaScript 👤 测评人背景 做了十几年市场营销,这两年短视频和直播的浪潮逼得我必须学会「面对镜头」。但说…

2026/7/23 9:19:28
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:28

月新闻