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

如何用ElementTree解析嵌套标签?获取member字段报错求助

问题描述

我是编程新手,尝试从给定XML条目提取Name、Category、Risk、Member四个字段,已成功获取其中3个,但获取member字段时触发AttributeError错误。

XML结构

<application>
  <entry id="120" name="100bao" ori_country="USA" ori_language="English">
   <category>general-internet</category>
   <subcategory>file-sharing</subcategory>
   <technology>peer-to-peer</technology>
   <evasive-behavior>yes</evasive-behavior>
   <consume-big-bandwidth>yes</consume-big-bandwidth>
   <used-by-malware>yes</used-by-malware>
   <able-to-transfer-file>yes</able-to-transfer-file>
   <has-known-vulnerability>yes</has-known-vulnerability>
   <tunnel-other-application>no</tunnel-other-application>
   <prone-to-misuse>yes</prone-to-misuse>
   <pervasive-use>yes</pervasive-use>
   <risk>5</risk>
   <references>
     <entry name="www.100bao.com">
      <link>http://www.100bao.com/</link>
     </entry>
   </references>
   <per-direction-regex>no</per-direction-regex>
   <appident>yes</appident>
   <default>
     <port>
       <member>tcp/3468,6346,11300</member>
     </port>
   </default>
 </entry>

原代码

import xml.etree.ElementTree as ET

mytree = ET.parse('C:/Documents/Parse Folder/apps.xml')
root = mytree.getroot()

for entry in root.findall('entry'):
    category = entry.find('category').text
    risk = entry.find('risk').text
    member = entry.find('member').text

print(entry.attrib, category, risk, member)

member = entry.find('member').text

报错信息

AttributeError: 'NoneType' object has no attribute 'text' 

问题原因

member 节点并非直接在 <entry> 节点下,而是嵌套在 <default> → <port> 的层级里。用 entry.find('member') 直接查找会返回None,调用.text自然触发AttributeError。另外原代码循环外的print和重复的member赋值毫无意义,只会输出最后一条entry的数据。


修正后的代码
import xml.etree.ElementTree as ET

mytree = ET.parse('C:/Documents/Parse Folder/apps.xml')
root = mytree.getroot()

for entry in root.findall('entry'):
    # 获取entry节点的name属性
    name = entry.attrib.get('name')
    category = entry.find('category').text
    risk = entry.find('risk').text
    # 按层级路径直接定位member节点
    member_node = entry.find('default/port/member')
    # 空值判断,避免节点缺失报错
    member = member_node.text if member_node is not None else '无端口信息'
    
    print(f"Name: {name}, Category: {category}, Risk: {risk}, Member: {member}")

优化建议
  • 增加空值判断:所有节点查找后先判断是否为None,再访问.text属性,避免因XML结构不完整报错
  • 用attrib.get()获取属性:相比直接entry.attrib['name'],get()方法在属性不存在时返回None,不会触发KeyError
  • 使用路径语法定位深层节点:通过find('父节点/子节点/孙节点')直接定位嵌套节点,不用逐层查找
  • 循环内处理数据:原代码循环外的print只能输出最后一条数据,把打印和数据处理放在循环内才能遍历所有条目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:15:42