Python新手求助:提取邮件HTML表格合并为Pandas DataFrame并导出Excel
解决Outlook邮件HTML表格合并为统一DataFrame的方案
核心思路
先将每个邮件中的HTML表格解析为结构一致的DataFrame,再通过Pandas的合并函数将所有DataFrame拼接成一个统一表格,最后导出到Excel。
分步实现
1. 标准化单个邮件表格的解析
- 用
pandas.read_html()解析HTML表格,该函数返回DataFrame列表,单表格场景取第一个元素即可。 - 统一列名:不同邮件的表格列名可能存在大小写、空格差异,提前标准化列名(比如转小写、替换空格为下划线)。
- 对齐列结构:提前定义目标列名,对每个解析后的DataFrame进行列重排,缺失列用
NaN填充。
2. 合并所有DataFrame
使用pd.concat()将所有标准化后的DataFrame合并,设置ignore_index=True重置全局索引,避免索引冲突。
完整示例代码
import pandas as pd import numpy as np import win32com.client from bs4 import BeautifulSoup # 可选,用于清理复杂HTML # 初始化Outlook连接 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") target_folder = outlook.GetDefaultFolder(6) # 6对应收件箱,可替换为你的目标文件夹 messages = target_folder.Items # 存储处理后的DataFrame列表 processed_dfs = [] # 定义目标列结构(根据你的实际表格列名调整) target_cols = ['order_id', 'customer_name', 'order_amount', 'order_date'] for msg in messages: # 仅处理HTML格式的邮件 if msg.BodyFormat != 2: continue try: # 清理HTML(可选,应对嵌套/复杂表格) soup = BeautifulSoup(msg.HTMLBody, 'html.parser') table_tag = soup.find('table') # 取第一个表格 if not table_tag: print(f"邮件 {msg.Subject} 未找到表格,跳过") continue # 解析表格为DataFrame table_df = pd.read_html(str(table_tag))[0] # 标准化列名 table_df.columns = [col.strip().lower().replace(' ', '_') for col in table_df.columns] # 对齐目标列,缺失列补NaN table_df = table_df.reindex(columns=target_cols, fill_value=np.nan) # 添加到列表 processed_dfs.append(table_df) except Exception as e: print(f"处理邮件 {msg.Subject} 失败: {str(e)}") continue # 合并所有DataFrame final_df = pd.concat(processed_dfs, ignore_index=True) # 导出到Excel final_df.to_excel("邮件表格汇总.xlsx", index=False)
注意事项
- 如果邮件表格存在多行表头,可在
pd.read_html()中指定header参数(比如pd.read_html(str(table_tag), header=1)[0])。 - 若部分表格结构差异过大(比如列数完全不同),可在代码中添加判断逻辑过滤这类表格,避免合并出错。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

