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

