You need to enable JavaScript to run this app. 使用BeautifulSoup从XML文件提取数据生成DataFrame时遇到数据不全问题
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup从XML文件提取数据生成DataFrame时遇到数据不全问题

问题原因

  • 原始代码直接全局提取所有同名标签,未按照XML的嵌套层级绑定同一数据行的不同字段,一旦四类标签的数量、顺序不严格一一对应,就会出现数据错位、空值问题
  • 创建DataFrame时强制指定全局dtype=int,而Generator Name、Fuel Type属于字符串类型,强制类型转换会触发异常导致部分数据丢失

修正后代码

import bs4 as bs
import urllib.request
import pandas as pd

source = urllib.request.urlopen("http://reports.ieso.ca/public/GenOutputCapability/PUB_GenOutputCapability.xml").read()
soup = bs.BeautifulSoup(source,'xml')

data = []
# 先找到所有行级父节点,根据该XML实际结构,数据都嵌套在<GeneratorData>节点下
for gen_node in soup.find_all('GeneratorData'):
    # 每个父节点内单独提取对应字段,保证关联正确
    g_name = gen_node.find('GeneratorName').get_text(strip=True) if gen_node.find('GeneratorName') else None
    f_type = gen_node.find('FuelType').get_text(strip=True) if gen_node.find('FuelType') else None
    hour = gen_node.find('Hour').get_text(strip=True) if gen_node.find('Hour') else None
    mw = gen_node.find('EnergyMW').get_text(strip=True) if gen_node.find('EnergyMW') else None
    data.append([g_name, f_type, hour, mw])

df = pd.DataFrame(data, columns = ['Generator Name','Fuel Type','Hour','Energy MW'])
# 单独对数值列做类型转换,避免影响字符串列
df['Hour'] = df['Hour'].astype(int)
df['Energy MW'] = pd.to_numeric(df['Energy MW'], errors='coerce')

display(df)

验证说明

修改后会优先按嵌套节点匹配同一行数据,避免索引错位,同时单独对数值列做类型转换,兼容可能的空值场景,运行后即可得到完整的180行有效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:48:01