You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:21:03