影刀RPA进阶教程复杂网页表格提取攻略合并单元格多级表头与不规则表格的通用解法你以为网页表格采集就是找到表格→读取→写入Excel那是标准化表格的玩法。真实世界里的网页表格长这样合并单元格——第一行跨了三列第二行又拆开多级表头——品类、一级指标、二级指标三层叠在一起单元格里塞了图片和链接——不是纯文本表格长得像表格实际上是divcss搭出来的这篇文章专治各种不规矩的网页表格。先判断这是真表格还是假表格打开F12检查元素看外层标签真表格table标签tabletrtd数据1/tdtd数据2/td/tr/table这种最简单影刀批量抓取表格数据指令直接搞定。假表格div模拟divclasstabledivclassrowdivclasscell数据1/divdivclasscell数据2/div/div/div这种需要逐行逐列定位不能用批量抓取表格。第一步先判类型后面的策略完全不同。场景一合并单元格处理合并单元格是最常见的不规则表格。HTML里通过rowspan跨行合并和colspan跨列合并实现tabletrtdrowspan2华东区/tdtd上海/tdtd10,000/td/trtrtd杭州/tdtd8,000/td/tr/table期望的Excel结果拼多多店群自动化报活动上架区域城市金额华东区上海10,000| 华东区 | 杭州 | 8,000 |方案Pythonpandas读取影刀的批量抓取表格数据指令对合并单元格的还原不太理想。用Python的pandas更可靠importpandasaspd# 直接读取页面上的tabletablespd.read_html(https://example.com/report.html)# tables是一个列表取第一个dftables[0]# 向前填充合并单元格dfdf.fillna(methodffill)# 保存df.to_excel(output.xlsx,indexFalse)fillna(methodffill)是关键它会用上方的非空值填充下方空值正好解决合并单元格的问题。在影刀中调用1. 获取当前页面HTML或直接用Python requests获取 2. Python代码块 import pandas as pd df pd.read_html(页面源码)[0] df df.fillna(methodffill) df.to_excel(merged_table.xlsx, indexFalse) 3. 读取生成的Excel场景二多级表头这种表格长这样2024年Q12024年Q12024年Q22024年Q2品类销售额利润销售额利润电子1002015030服装80259028第一行是大分类季度第二行是具体指标。读取时会把第一行和第二行读成独立的行。方案手动拼接表头importpandasaspd dfpd.read_html(page.html,headerNone)[0]# 前两行是表头header_row1df.iloc[0].fillna(methodffill)header_row2df.iloc[1]# 拼接列0直接用第二行其他列用季度_指标格式new_columns[]foriinrange(len(header_row1)):ifi0:new_columns.append(str(header_row2[i]))else:new_columns.append(f{header_row1[i]}_{header_row2[i]})# 取数据部分df_datadf.iloc[2:].reset_index(dropTrue)df_data.columnsnew_columns df_data.to_excel(multi_header.xlsx,indexFalse)结果是品类2024年Q1_销售额2024年Q1_利润2024年Q2_销售额2024年Q2_利润电子1002015030场景三单元格里有图片/链接/按钮有些表格的单元格不是纯文本tdimgsrcstar.pngclassratingspanclassscore4.5/spanahref/detail/123商品名称/a/td你只想要4.5和商品名称但直接取td的文本会拿到一堆废东西。方案精确XPath定位不要取整个td而是定位到具体元素# 取评分 //td[classrating-cell]/span[classscore]/text() # 取商品链接 //td[classname-cell]/a/text() # 取链接href //td[classname-cell]/a/href有时候写两个循环分别取不同类型的数据比试图在一个循环里全取完更省心。场景四假表格——divcss模拟有些现代化网站不用table标签而是用div加CSS模拟表格divclassant-table-bodydivclassant-table-rowdivclassant-table-cell数据A1/divdivclassant-table-cell数据A2/div/divdivclassant-table-rowdivclassant-table-cell数据B1/divdivclassant-table-cell数据B2/div/div/div方案先定位行再循环列1. 获取所有行元素//div[contains(class, ant-table-row)] 2. 循环每一行 2.1 获取该行所有单元格./div[contains(class, ant-table-cell)] 2.2 循环每个单元格提取文本 2.3 拼接成本行数据 3. 所有行处理完写入Excel缺点顺序依赖CSS渲染如果CSS没按视觉顺序排列提取出来的顺序就是乱的。对于分页的假表格每页的结构是一样的在循环里加翻页逻辑就行。场景五表里嵌套了另一个表格tabletrtd基本信息/td/trtrtdtable!-- 嵌套表格 --trtd姓名/tdtd张三/td/trtrtd年龄/tdtd25/td/tr/table/td/tr/tablepandas读这种表格会把它展平成三列很难还原结构。方案分开提取1. 提取外层表格的基本信息 2. 对于包含嵌套表格的单元格 2.1 单独定位嵌套的table元素 2.2 单独读取嵌套表格 2.3 以主键值关联回主表 3. 在Excel中用两个sheet分别存放外层和内层数据不要试图把嵌套表格展平到一行——数据关系会乱。TEMU店群矩阵自动化运营核价报活动实战万能表格提取封装把上面学到的思路封装成一个处理流程函数万能表格提取(url, 表头行数, 是否有合并单元格) 1. requests获取页面HTML 2. pandas.read_html()读取所有table 3. 遍历每个table 3.1 如果 表头行数1 调用多级表头拼接 3.2 如果 有合并单元格 调用fillna(methodffill) 3.3 如果 表格行列混乱可能是假表格 跳过pandas用XPath逐行逐列提取 4. 每个table存一个sheet 5. 输出xlsx文件实际使用时要灵活——先看一眼页面源码判断类型再选策略别一上来就硬套。避坑清单坑1pandas.read_html()只读到第一个表格# 错误只读了第一个dfpd.read_html(url)[0]# 正确先看看有几个tablespd.read_html(url)print(f找到{len(tables)}个表格)# 可能需要的是第N个dftables[2]# 第三个坑2页面需要动态加载pandas.read_html()只能读页面源码中的表格JS动态渲染的它看不见。解决先用影刀打开页面、等表格加载完、获取完整HTML再传给pandas。坑3空值被pandas删了# 保留空值dfpd.read_html(html,keep_default_naFalse)[0]坑4数字被当成字符串# 清理并转换df[金额]df[金额].str.replace([¥,],,regexTrue)df[金额]pd.to_numeric(df[金额],errorscoerce)总结网页表格提取的复杂度取决于表格的规矩程度标准table → 影刀批量抓取一行搞定合并单元格 → pandas read_html ffill多级表头 → pandas 手动拼接表头假表格(div) → XPath逐行逐列嵌套表格 → 分开提取、分sheet存储遇到问题先F12看源码判断类型再选策略。别上来就对着一个div表格用批量抓取表格数据——它不认得。内容标签#影刀RPA #数据采集 #网页表格 #pandas #XPath作者林焱系列影刀RPA进阶教程系列——攻克真实业务中的数据采集难题
影刀RPA进阶教程_复杂网页表格提取攻略合并单元格多级表头与不规则表格
影刀RPA进阶教程复杂网页表格提取攻略合并单元格多级表头与不规则表格的通用解法你以为网页表格采集就是找到表格→读取→写入Excel那是标准化表格的玩法。真实世界里的网页表格长这样合并单元格——第一行跨了三列第二行又拆开多级表头——品类、一级指标、二级指标三层叠在一起单元格里塞了图片和链接——不是纯文本表格长得像表格实际上是divcss搭出来的这篇文章专治各种不规矩的网页表格。先判断这是真表格还是假表格打开F12检查元素看外层标签真表格table标签tabletrtd数据1/tdtd数据2/td/tr/table这种最简单影刀批量抓取表格数据指令直接搞定。假表格div模拟divclasstabledivclassrowdivclasscell数据1/divdivclasscell数据2/div/div/div这种需要逐行逐列定位不能用批量抓取表格。第一步先判类型后面的策略完全不同。场景一合并单元格处理合并单元格是最常见的不规则表格。HTML里通过rowspan跨行合并和colspan跨列合并实现tabletrtdrowspan2华东区/tdtd上海/tdtd10,000/td/trtrtd杭州/tdtd8,000/td/tr/table期望的Excel结果拼多多店群自动化报活动上架区域城市金额华东区上海10,000| 华东区 | 杭州 | 8,000 |方案Pythonpandas读取影刀的批量抓取表格数据指令对合并单元格的还原不太理想。用Python的pandas更可靠importpandasaspd# 直接读取页面上的tabletablespd.read_html(https://example.com/report.html)# tables是一个列表取第一个dftables[0]# 向前填充合并单元格dfdf.fillna(methodffill)# 保存df.to_excel(output.xlsx,indexFalse)fillna(methodffill)是关键它会用上方的非空值填充下方空值正好解决合并单元格的问题。在影刀中调用1. 获取当前页面HTML或直接用Python requests获取 2. Python代码块 import pandas as pd df pd.read_html(页面源码)[0] df df.fillna(methodffill) df.to_excel(merged_table.xlsx, indexFalse) 3. 读取生成的Excel场景二多级表头这种表格长这样2024年Q12024年Q12024年Q22024年Q2品类销售额利润销售额利润电子1002015030服装80259028第一行是大分类季度第二行是具体指标。读取时会把第一行和第二行读成独立的行。方案手动拼接表头importpandasaspd dfpd.read_html(page.html,headerNone)[0]# 前两行是表头header_row1df.iloc[0].fillna(methodffill)header_row2df.iloc[1]# 拼接列0直接用第二行其他列用季度_指标格式new_columns[]foriinrange(len(header_row1)):ifi0:new_columns.append(str(header_row2[i]))else:new_columns.append(f{header_row1[i]}_{header_row2[i]})# 取数据部分df_datadf.iloc[2:].reset_index(dropTrue)df_data.columnsnew_columns df_data.to_excel(multi_header.xlsx,indexFalse)结果是品类2024年Q1_销售额2024年Q1_利润2024年Q2_销售额2024年Q2_利润电子1002015030场景三单元格里有图片/链接/按钮有些表格的单元格不是纯文本tdimgsrcstar.pngclassratingspanclassscore4.5/spanahref/detail/123商品名称/a/td你只想要4.5和商品名称但直接取td的文本会拿到一堆废东西。方案精确XPath定位不要取整个td而是定位到具体元素# 取评分 //td[classrating-cell]/span[classscore]/text() # 取商品链接 //td[classname-cell]/a/text() # 取链接href //td[classname-cell]/a/href有时候写两个循环分别取不同类型的数据比试图在一个循环里全取完更省心。场景四假表格——divcss模拟有些现代化网站不用table标签而是用div加CSS模拟表格divclassant-table-bodydivclassant-table-rowdivclassant-table-cell数据A1/divdivclassant-table-cell数据A2/div/divdivclassant-table-rowdivclassant-table-cell数据B1/divdivclassant-table-cell数据B2/div/div/div方案先定位行再循环列1. 获取所有行元素//div[contains(class, ant-table-row)] 2. 循环每一行 2.1 获取该行所有单元格./div[contains(class, ant-table-cell)] 2.2 循环每个单元格提取文本 2.3 拼接成本行数据 3. 所有行处理完写入Excel缺点顺序依赖CSS渲染如果CSS没按视觉顺序排列提取出来的顺序就是乱的。对于分页的假表格每页的结构是一样的在循环里加翻页逻辑就行。场景五表里嵌套了另一个表格tabletrtd基本信息/td/trtrtdtable!-- 嵌套表格 --trtd姓名/tdtd张三/td/trtrtd年龄/tdtd25/td/tr/table/td/tr/tablepandas读这种表格会把它展平成三列很难还原结构。方案分开提取1. 提取外层表格的基本信息 2. 对于包含嵌套表格的单元格 2.1 单独定位嵌套的table元素 2.2 单独读取嵌套表格 2.3 以主键值关联回主表 3. 在Excel中用两个sheet分别存放外层和内层数据不要试图把嵌套表格展平到一行——数据关系会乱。TEMU店群矩阵自动化运营核价报活动实战万能表格提取封装把上面学到的思路封装成一个处理流程函数万能表格提取(url, 表头行数, 是否有合并单元格) 1. requests获取页面HTML 2. pandas.read_html()读取所有table 3. 遍历每个table 3.1 如果 表头行数1 调用多级表头拼接 3.2 如果 有合并单元格 调用fillna(methodffill) 3.3 如果 表格行列混乱可能是假表格 跳过pandas用XPath逐行逐列提取 4. 每个table存一个sheet 5. 输出xlsx文件实际使用时要灵活——先看一眼页面源码判断类型再选策略别一上来就硬套。避坑清单坑1pandas.read_html()只读到第一个表格# 错误只读了第一个dfpd.read_html(url)[0]# 正确先看看有几个tablespd.read_html(url)print(f找到{len(tables)}个表格)# 可能需要的是第N个dftables[2]# 第三个坑2页面需要动态加载pandas.read_html()只能读页面源码中的表格JS动态渲染的它看不见。解决先用影刀打开页面、等表格加载完、获取完整HTML再传给pandas。坑3空值被pandas删了# 保留空值dfpd.read_html(html,keep_default_naFalse)[0]坑4数字被当成字符串# 清理并转换df[金额]df[金额].str.replace([¥,],,regexTrue)df[金额]pd.to_numeric(df[金额],errorscoerce)总结网页表格提取的复杂度取决于表格的规矩程度标准table → 影刀批量抓取一行搞定合并单元格 → pandas read_html ffill多级表头 → pandas 手动拼接表头假表格(div) → XPath逐行逐列嵌套表格 → 分开提取、分sheet存储遇到问题先F12看源码判断类型再选策略。别上来就对着一个div表格用批量抓取表格数据——它不认得。内容标签#影刀RPA #数据采集 #网页表格 #pandas #XPath作者林焱系列影刀RPA进阶教程系列——攻克真实业务中的数据采集难题