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

