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

如何使用BeautifulSoup分别提取HTML表格每列的计划及非计划数值

实现方案

pd.read_html 仅能提取单元格文本内容,会丢失HTML标签的类属性,因此无法直接区分计划/非计划数值,需要结合BeautifulSoup遍历表格的行和列,关联列索引、单元格类属性和数值完成按列统计。

完整可运行代码

import pandas as pd
import requests
from bs4 import BeautifulSoup

URL = 'http://gpi.tge.pl/zestawienie-ubytkow' 
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')

# 定位目标表格
table = soup.find_all('table')[0]

# 提取列对应的日期(和你原代码header=2对应,可根据实际表格结构调整表头行索引)
header_rows = table.find_all('tr')[:2]
date_row = header_rows[1]
col_dates = [td.get_text(strip=True) for td in date_row.find_all('td')]

# 初始化统计结构,key为列索引,value存储对应列的两类数值总和
col_stats = {}
for col_idx in range(len(col_dates)):
    col_stats[col_idx] = {'planned': 0, 'unplanned': 0}

# 遍历数据行(跳过前2行表头)
for tr in table.find_all('tr')[2:]:
    tds = tr.find_all('td')
    for col_idx, td in enumerate(tds):
        val_text = td.get_text(strip=True)
        # 跳过非数字的空单元格/无效值
        if not val_text.isdigit():
            continue
        val = int(val_text)
        td_class = td.get('class', [])
        # 按类累加对应列的数值
        if 'cal-planned' in td_class:
            col_stats[col_idx]['planned'] += val
        elif 'cal-unplanned' in td_class:
            col_stats[col_idx]['unplanned'] += val

# 输出统计结果,也可直接转DataFrame做后续处理
result = []
for col_idx, date in enumerate(col_dates):
    stats = col_stats[col_idx]
    result.append({
        '日期': date,
        '计划类总和': stats['planned'],
        '非计划类总和': stats['unplanned']
    })
result_df = pd.DataFrame(result)
print(result_df)

补充说明

  • 如果表格表头结构和示例不同,可自行调整header_rows的切片范围和date_row的索引,确保提取的日期和列对应
  • 代码自动过滤了非数字的无效单元格,避免转换时报错
  • 最终输出的result_df可直接用于后续的导出、可视化等操作

内容的提问来源于stack exchange,提问作者Kotwiczowicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:06:05