Python从XML字符串提取日期报错:AttributeError: 'NoneType'无group属性
解决XML嵌套标签cbc:DueDate的提取问题
报错原因
你的代码报错AttributeError: 'NoneType' object has no attribute 'group',是因为直接将<cbc:Description>节点转为字符串时,得到的是DOM节点的对象描述(而非节点内部的XML内容),导致正则表达式找不到匹配的<cbc:DueDate>标签,re.search返回None,调用group()自然报错。
解决方案
方案1:修复节点内容获取逻辑(基于原生xml.dom)
先正确提取<cbc:Description>节点内部的XML内容,再用正则匹配:
from xml.dom import minidom import re # 假设datos是已解析完成的DOM对象 desc_node = datos.getElementsByTagName("cbc:Description")[0] # 拼接节点内部所有子节点的XML内容 inner_xml = "" for child in desc_node.childNodes: inner_xml += child.toxml() # 正则匹配提取日期 match_result = re.search(r'<cbc:DueDate>(.+?)</cbc:DueDate>', inner_xml) if match_result: due_date = match_result.group(1) print(due_date) # 输出:2022-07-16 else: print("未找到<cbc:DueDate>标签")
方案2:用XPath直接定位(更简洁,推荐)
使用lxml库通过XPath直接定位嵌套标签,避免正则处理XML的繁琐:
- 先安装依赖:
pip install lxml - 代码示例:
from lxml import etree # 解析目标XML文件 tree = etree.parse("你的XML文件路径.xml") # 配置XML命名空间(需替换为你XML中cbc前缀对应的实际命名空间,可在根节点找到) namespaces = {"cbc": "http://实际命名空间URL"} # 用XPath直接提取<cbc:DueDate>的文本内容 due_date = tree.xpath('//cbc:Description/cbc:DueDate/text()', namespaces=namespaces)[0] print(due_date) # 输出:2022-07-16
注意:XML中的前缀(如cbc)都对应一个官方命名空间URL,必须在代码中指定,否则XPath无法识别节点。
内容的提问来源于stack exchange,提问作者Luiz Villalba
相关产品推荐
相关产品推荐

