Beautiful Soup新手求助:爬取在线报告三类指定表格数据
实现方案
核心思路
- 先通过HTTP请求获取目标页面的完整HTML源码
- 解析时注意三个目标业务表格都带有
BORDER="1"属性,且每个表格的首行表头加粗文本正好对应SUMMARY、Generation、Interchange三个标识,通过这个特征准确定位目标表格,避免抓到外层嵌套的布局表格 - 逐行遍历定位到的表格,跳过表头行,提取每行单元格的有效文本,整理成结构化数据即可
可直接运行的参考代码
import requests from bs4 import BeautifulSoup # 目标页面地址 url = "http://ets.aeso.ca/ets_web/ip/Market/Reports/CSDReportServlet" # 发起请求获取页面源码 resp = requests.get(url, timeout=10) resp.encoding = resp.apparent_encoding # 自动识别编码避免乱码 soup = BeautifulSoup(resp.text, "html.parser") # 要提取的三个表格名称 target_tables = ["SUMMARY", "Generation", "Interchange"] result = {} # 遍历所有带border属性的业务表格(排除外层用于布局的无border表格) for table in soup.find_all("table", border="1"): # 找到当前表格的表头文本 header_b = table.find("b") if not header_b: continue table_name = header_b.get_text(strip=True) if table_name not in target_tables: continue # 提取当前表格的所有行数据 table_data = [] all_rows = table.find_all("tr") for row in all_rows[1:]: # 第一行是表头,直接跳过 cells = [cell.get_text(strip=True) for cell in row.find_all(["td", "th"])] # 过滤空行 if cells: table_data.append(cells) result[table_name] = table_data # 打印测试输出 for table_name, data in result.items(): print(f"===== {table_name} 表格数据 =====") for row in data: print(row)
使用说明
- 代码默认把每个表格的数据存为二维列表,如果需要键值对格式(比如SUMMARY表是两列的指标名+数值结构),可以直接把对应行的两个元素组装成字典
- 如果后续页面表格样式微调,只要调整匹配表格的属性判断逻辑即可,提取到的数据可以直接写入CSV、数据库做后续分析
内容的提问来源于stack exchange,提问作者NJ_315
相关产品推荐
相关产品推荐

