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

使用Python ElementTree API遍历XML失败的问题排查

问题:MediaWiki导出XML无法遍历<page>元素

按照Python官方ElementTree教程操作示例XML(根节点为<data>,包含多个<country>子元素)时,以下代码能正常遍历并输出三次"FOUND":

import xml.etree.ElementTree as ET

tree = ET.parse('Country.xml')
root = tree.getroot()

for country in root.findall('country'):
    print("FOUND")

但处理自己的MediaWiki导出XML(根节点为<mediawiki>,包含命名空间,且存在一个<page>子元素)时,使用类似逻辑的代码既无"FOUND"输出也无报错:

import xml.etree.ElementTree as ET

tree = ET.parse('Test.xml')
root = tree.getroot()

for page in root.findall('page'):
    print("FOUND")

原因分析

MediaWiki导出的XML带有XML命名空间,比如根节点通常包含类似xmlns="http://www.mediawiki.org/xml/export-0.10/"的属性。ElementTree的findall方法默认不会识别无前缀的标签名,必须显式指定命名空间才能匹配到对应元素。

解决方案

方法1:提取命名空间映射后使用前缀查找

先从根节点标签中提取命名空间,再通过命名空间映射查找元素:

import xml.etree.ElementTree as ET

tree = ET.parse('Test.xml')
root = tree.getroot()

# 从根节点标签中提取命名空间
ns_prefix = root.tag.split('}')[0].strip('{')
ns = {'mw': ns_prefix}

# 带命名空间前缀查找page元素
for page in root.findall('mw:page', ns):
    print("FOUND")

方法2:直接使用完整命名空间标签名

如果已知MediaWiki XML的命名空间,也可以直接写全带命名空间的标签名:

import xml.etree.ElementTree as ET

tree = ET.parse('Test.xml')
root = tree.getroot()

# 替换为你实际的MediaWiki命名空间
for page in root.findall('{http://www.mediawiki.org/xml/export-0.10/}page'):
    print("FOUND")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:35:20