Python ElementTree无法提取带xml:lang属性元素及parent节点文本
解决ElementTree提取XML元素文本失败的问题
针对你的情况,虽然能找到<display-name>和<parent>节点但提取不到文本,可按以下方式排查修复:
可能原因与解决方案
- 元素文本存在嵌套或空白干扰:如果XML中这些元素的文本并非直接节点值(比如嵌套子元素,或文本被换行/空白包裹),直接用
.text可能无法获取完整内容,此时可通过itertext()遍历所有子节点文本并拼接。 - 命名空间严格匹配问题:确认命名空间URL完全一致(包括大小写、特殊字符),ElementTree对命名空间是严格匹配的,细微差异都会导致节点查找异常。
- 简化提取逻辑:使用
findtext()方法可直接获取文本并指定默认值,无需手动处理节点为None的情况,代码更简洁可靠。
修改后的代码示例
import xml.etree.ElementTree as ET ns = {'d': 'http://www.demandware.com/xml/impex/catalog/2006-10-31'} root = ET.fromstring("""<?xml version="1.0" encoding="UTF-8"?> <catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="my-catalog-id"> <category category-id="my_id1"> <display-name xml:lang="cs-CZ">Bla bla 1</display-name> <online-flag>false</online-flag> </category> <category category-id="my_id2"> <display-name xml:lang="cs-CZ">Bla bla 2</display-name> <online-flag>false</online-flag> <parent>my_id1</parent> </category> </catalog> """) def parse_category(category_node): category_id = category_node.attrib['category-id'] is_online = category_node.findtext('d:online-flag', namespaces=ns) == "true" # 用findtext直接获取文本,节点不存在时返回空字符串 display_name = category_node.findtext('d:display-name', default='', namespaces=ns) # 若元素存在嵌套子节点,改用以下方式拼接所有文本 # display_name = ''.join(category_node.find('d:display-name', ns).itertext()) if category_node.find('d:display-name', ns) else '' parent_id = category_node.findtext('d:parent', default='', namespaces=ns) print("{} | {} | {} | {}".format(category_id, display_name, is_online, parent_id)) for child in root: if child.tag == "{{{0}}}category".format(ns['d']): parse_category(child)
说明
findtext()方法会自动处理节点不存在的场景,返回指定默认值,避免了手动判断None的冗余代码。- 如果你的实际XML中
<display-name>或<parent>包含嵌套子元素(比如<display-name><span>Bla bla</span></display-name>),使用itertext()可以提取所有层级的文本内容并拼接成完整字符串。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

