如何使用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
相关产品推荐
相关产品推荐

