You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历含不同子标签的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10