如何通过Python Etree获取XML中event-date下的date节点内容
如何用Python的ElementTree仅提取下的节点内容
问题场景
需要从以下XML结构中,仅提取<event-date>节点下的<date>内容,但现有代码会抓取所有<date>节点,且访问<event-date>相关内容时返回空:
<events-data> <dossier-event event-type="new" id="EVT_4573534"> <event-date> <date>20220816</date> </event-date> <event-code>EPIDOSNWIAI</event-code> <event-text event-text-type="DESCRIPTION">text</event-text> </dossier-event> </events-data> <events-data> <dossier-event event-type="new" id="EVT_4573535"> <event-date> <date>20220402</date> </event-date> <event-code>EPIDOS PCT</event-code> <event-text event-text-type="DESCRIPTION">text1</event-text> </dossier-event> </events-data>
用户尝试的代码:
root_events = ET.fromstring(response_events.content) for element in root_events.iter('{http://myapi/register}date'): print(element.text)
解决方案
核心问题是XML节点带有命名空间,必须通过命名空间映射或完整命名空间标签名来定位节点,同时精准限定<date>的父节点为<event-date>。
方法1:使用XPath精准定位(推荐)
通过XPath直接指定节点层级,结合命名空间映射筛选目标节点:
import xml.etree.ElementTree as ET # 定义命名空间映射,简化节点引用 ns = {'reg': 'http://myapi/register'} root_events = ET.fromstring(response_events.content) # 定位所有event-date节点下的date子节点 for date_elem in root_events.findall('.//reg:event-date/reg:date', ns): print(date_elem.text)
'.//reg:event-date/reg:date'表示:查找任意层级下的<event-date>节点,再取其直接子节点<date>,确保只获取目标范围内的内容。
方法2:逐层遍历节点
先找到所有<event-date>节点,再从中提取子节点<date>:
import xml.etree.ElementTree as ET root_events = ET.fromstring(response_events.content) # 遍历所有带命名空间的event-date节点 for event_date in root_events.iter('{http://myapi/register}event-date'): # 从当前event-date节点下查找date子节点 date_elem = event_date.find('{http://myapi/register}date') if date_elem is not None: print(date_elem.text)
这种方式通过先锁定<event-date>节点,再获取其子节点,避免抓取无关的<date>节点。
关键说明
之前访问<event-date>为空,是因为XML中的节点实际带有http://myapi/register命名空间,直接使用不带命名空间的标签名无法匹配到节点,必须通过完整命名空间标签名或命名空间映射来引用。
内容的提问来源于stack exchange,提问作者Trend Freelancer
相关产品推荐
相关产品推荐

