Python如何处理带命名空间的XML

发布时间 - 2026-01-08 00:00:00    点击率:
Python处理带命名空间XML需显式声明命名空间映射字典,XPath中用“前缀:标签”形式查找,如ns:channel;默认命名空间也须指定前缀,URI必须完全匹配,不支持*通配符跨空间匹配。

Python处理带命名空间的XML,关键在于正确声明和使用命名空间前缀,否则findfindall等方法会找不到元素。

理解命名空间在ElementTree中的表示方式

ElementTree默认不自动识别XML文档中的xmlns声明。即使XML里写了xmlns="http://example.com/ns",你也不能直接用root.find("item")——必须显式传入命名空间映射字典。

  • 命名空间映射是一个字典,键是前缀(可自定义),值是URI字符串
  • XPath表达式中需用prefix:tagname写法,如"ns:item"
  • 默认命名空间(无前缀的xmlns="...")也要给它起个前缀,不能留空

使用namespaces参数进行查找

这是最常用也最推荐的方式:构造命名空间字典,传给findfindalliterfind等方法。

例如有如下XML:

立即学习“Python免费学习笔记(深入)”;



  
    My Feed
    Post 1
  

对应代码为:

import xml.etree.ElementTree as ET

tree = ET.parse("feed.xml") root = tree.getroot()

声明命名空间:这里用"ns"作为前缀

ns = {"ns": "https://www./link/ff4776b449efb88b35fbf6187af9771e"}

正确查找

channel = root.find("ns:channel", namespaces=ns) title = channel.find("ns:title", namespaces=ns) items = channel.findall("ns:item", namespaces=ns)

处理多个命名空间或带前缀的XML

如果XML中用了多个带前缀的命名空间(如xmlns:dc="http://purl.org/dc/elements/1.1/"),只需在字典中一并声明:

ns = {
    "rss": "https://www./link/ff4776b449efb88b35fbf6187af9771e",
    "dc": "http://purl.org/dc/elements/1.1/"
}

查找 dc:creator

creator = item.find("dc:creator", namespaces=ns)

注意:前缀名(如"dc")可以任意取,只要和XPath中一致即可;URI必须完全匹配XML中声明的值(包括末尾斜杠)。

避免常见坑:默认命名空间与通配符

ElementTree不支持*通配符跨命名空间匹配。不要写root.findall("*:item")——它不会生效。

  • 若不确定命名空间,可先用root.tag打印根元素全名,如{https://www./link/ff4776b449efb88b35fbf6187af9771e}rss,从中提取URI
  • 想忽略命名空间?可用正则提取本地名:elem.tag.split("}")[-1],再遍历比对,但性能较差,仅作备用
  • 第三方库如lxml支持etree.XPath和更灵活的命名空间处理,适合复杂场景


# python 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  网页设计与网站制作内容,怎样注册网站?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  WordPress 子目录安装中正确处理脚本路径的完整指南  iOS验证手机号的正则表达式  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  详解jQuery中的事件  高端建站三要素:定制模板、企业官网与响应式设计优化  phpredis提高消息队列的实时性方法(推荐)  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  教你用AI润色文章,让你的文字表达更专业  如何快速搭建高效服务器建站系统?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Linux系统命令中screen命令详解  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何在IIS中新建站点并配置端口与IP地址?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何在阿里云虚拟主机上快速搭建个人网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何在新浪SAE免费搭建个人博客?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  手机软键盘弹出时影响布局的解决方法  如何选择可靠的免备案建站服务器?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel如何记录自定义日志?(Log频道配置)  如何快速搭建高效WAP手机网站吸引移动用户?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Thinkphp 中 distinct 的用法解析  如何快速生成ASP一键建站模板并优化安全性?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  香港服务器网站卡顿?如何解决网络延迟与负载问题?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何在万网利用已有域名快速建站?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  轻松掌握MySQL函数中的last_insert_id()  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何快速搭建FTP站点实现文件共享?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤