使用BeautifulSoup搭配循环与判断语句填充Pandas DataFrame
解决方法
核心问题是现有代码将所有单元格数据平铺存入一维列表,丢失了行边界信息,调整为按行存储即可直接生成对应结构的DataFrame。
方案1:调整现有抓取逻辑(更推荐,避免数据错位)
直接修改遍历逻辑,抓取时就保留行结构,修改后代码如下:
from bs4 import BeautifulSoup import pandas as pd # 替换为你的本地HTML文件路径 url = "你的文件路径.html" # 替换为导出Excel的保存路径 output = "输出结果.xlsx" # 替换为你自定义的列名,数量和实际列数一致即可 pks_col_names = ["列1", "列2", "...", "列18"] # 原有判断有效表格的函数 def iserror(func, *args, **kw): try: func(*args, **kw) return False except Exception: return True # 读取解析HTML with open(url, encoding='utf-8') as html_file: soup = BeautifulSoup(html_file, 'html.parser') all_tables = soup.find_all('table') # 二维列表存储所有行,每个子元素对应一行的所有列值 row_list = [] for tnum, tables in enumerate(all_tables): if iserror(all_tables[tnum].tbody): table = tables.findAll('tr') for rnum, row in enumerate(table): table_row = table[rnum].findAll('td') # 这里的数字调整为你实际每行的列数,按描述18列就填18 if len(table_row) == 18: # 直接生成当前行的列值列表,追加到行列表 current_row = [col.string for col in table_row] row_list.append(current_row) # 直接生成DataFrame df = pd.DataFrame(row_list, columns=pks_col_names) # 导出到Excel df.to_excel(output, index=False)
注意:代码中判断len(table_row)的数值需和你实际表格的列数匹配,你之前代码写的17,可根据实际抓取的列数调整
方案2:已生成平铺列表的快速拆分方法
如果你已经生成了完整的一维col_list,且确认每行固定为N列(比如18列),可以直接按固定长度拆分生成二维列表:
# 每行的列数,按实际情况修改 n_cols = 18 # 按每n_cols个元素切分一维列表,生成二维行列表 row_list = [col_list[i:i+n_cols] for i in range(0, len(col_list), n_cols)] # 生成DataFrame df = pd.DataFrame(row_list, columns=pks_col_names)
注意:需确保col_list总长度是n_cols的整数倍,否则最后一行会出现缺列问题
内容的提问来源于stack exchange,提问作者Jeff N
相关产品推荐
相关产品推荐

