使用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_
相关产品推荐
相关产品推荐

