如何遍历含不同子标签的XML并解析,缺失标签填Null到DataFrame?
解决XML解析中缺失标签导致的AttributeError问题
问题背景
手里有studentinfo.xml文件,其中<StudentScreening>的子标签(比如name、age等)并非每个条目都完整。用BeautifulSoup和pandas解析并存储到DataFrame时,因部分子标签缺失触发AttributeError: 'NoneType' object has no attribute 'text'错误,需要添加判断逻辑,让缺失标签对应的DataFrame位置自动填充null/na,同时保证程序继续执行遍历。
XML示例
<?xml version="1.0" encoding="UTF-8"?> <StudentBreakdown> <Studentdata> <StudentScreening> <name>Sam Davies</name> <age>15</age> <hair>Black</hair> <eyes>Blue</eyes> <grade>10</grade> <teacher>Draco Malfoy</teacher> <dorm>Innovation Hall</dorm> </StudentScreening> <StudentScreening> <name>Cassie Stone</name> <age>14</age> <hair>Science</hair> <grade>9</grade> <teacher>Luna Lovegood</teacher> </StudentScreening> <StudentScreening> <name>Derek Brandon</name> <age>17</age> <eyes>green</eyes> <teacher>Ron Weasley</teacher> <dorm>Hogtie Manor</dorm> </StudentScreening> </Studentdata> </StudentBreakdown>
原代码的问题点
原代码存在几处明显错误,直接导致报错和功能失效:
- 标签查找语法错误:用
info.find('<name>')而非正确的info.find('name'),多了不必要的尖括号 - 目标标签匹配错误:用
soup.find_all('info'),但XML中实际的学生数据标签是<StudentScreening> - 缺失标签未处理:直接调用
.text,当标签不存在时find()返回None,触发AttributeError - 方法调用错误:
df1.append()已被pandas弃用,且拼写错误ingore_index应为ignore_index
修复后的代码
import pandas as pd from bs4 import BeautifulSoup def parse_xml(file_content): soup = BeautifulSoup(file_content, 'xml') # 定义DataFrame列名与对应XML标签的映射 column_tag_map = { 'StudentName': 'name', 'Age': 'age', 'Hair': 'hair', 'Eyes': 'eyes', 'Grade': 'grade', 'Teacher': 'teacher', 'Dorm': 'dorm' } df = pd.DataFrame(columns=column_tag_map.keys()) # 定位所有学生数据标签 all_students = soup.find_all('StudentScreening') total_students = len(all_students) for index, student in enumerate(all_students): row = {} for col_name, tag_name in column_tag_map.items(): # 先查找标签,存在则取文本,不存在则设为None(自动转为NaN) elem = student.find(tag_name) row[col_name] = elem.text.strip() if elem else None # 用loc方法添加行,替代已弃用的append df.loc[index] = row print(f'正在添加第 {index+1}/{total_students} 行数据') return df # 读取XML文件 with open('studentinfo.xml', 'r', encoding='UTF-8') as f: file_content = f.read() # 解析并生成DataFrame student_df = parse_xml(file_content) print(student_df)
关键修复说明
- 修正标签查找:去掉标签名的尖括号,匹配XML中实际的
<StudentScreening>标签 - 缺失标签处理:通过
elem.text.strip() if elem else None的三元表达式,判断标签是否存在,不存在时返回None,pandas会自动将其转为NaN - 优化数据添加:用
df.loc[index]替代已弃用的append()方法,提升性能且符合pandas最新规范 - 编码兼容:读取文件时指定
encoding='UTF-8',避免中文或特殊字符乱码
内容的提问来源于stack exchange,提问作者PickleRick
相关产品推荐
相关产品推荐

