如何在 Python 中使用 LXML 捕获 XML 文件的所有元素名称?

2024-04-24

我能够使用 lxml 来完成我想做的大部分事情,尽管浏览令人困惑的示例和教程很困难。简而言之,我能够读取外部 xml 文件并通过 lxml 将其导入正确的树状格式。

为了证明这一点,如果我输入:

print(etree.tostring(myXmlTree, pretty_print= True, method= "xml") )

我得到以下输出:

<net xmlns="http://www.arin.net/whoisrws/core/v1" xmlns:ns2="http://www.arin.net/whoisrws/rdns/v1" xmlns:ns3="http://www.arin.net/whoisrws/netref/v2" termsOfUse="https://www.arin.net/whois_tou.html">
 <registrationDate>2006-08-29T00:00:00-04:00</registrationDate>
 <ref>http://whois.arin.net/rest/net/NET-79-0-0-0-1</ref>
 <endAddress>79.255.255.255</endAddress>
 <handle>NET-79-0-0-0-1</handle>
 <name>79-RIPE</name>
 <netBlocks>
  <netBlock>
   <cidrLength>8</cidrLength>
   <endAddress>79.255.255.255</endAddress>
   <description>Allocated to RIPE NCC</description>
   <type>RN</type>
   <startAddress>79.0.0.0</startAddress>
  </netBlock>
 </netBlocks>
 <orgRef name="RIPE Network Coordination Centre" handle="RIPE">http://whois.arin.net/rest/org/RIPE</orgRef>
 <comment>
  <line number="0">These addresses have been further assigned to users in</line>
  <line number="1">the RIPE NCC region. Contact information can be found in</line>
  <line number="2">the RIPE database at http://www.ripe.net/whois</line>
 </comment>
 <startAddress>79.0.0.0</startAddress>
 <updateDate>2009-05-18T07:34:02-04:00</updateDate>
 <version>4</version>
</net>

好吧,这对人类消费来说很有用,但对机器来说就没用了。如果我想要特定元素,例如 xml 中的起始和结束 IP 地址,我可以输入:

ns = myXmlTree.nsmap.values()[0]
myXmlTree.findall("{" + ns + "}startAddress")[0].text
myXmlTree.findall("{" + ns + "}endAddress")[0].text

我会收到:

'79.0.0.0'
'79.255.255.255'

但我仍然需要以人的身份查看 xml 文件才能知道其中有哪些元素。相反,我希望能够检索特定级别的所有元素的名称,然后自动遍历该级别。因此,举例来说,我想做类似的事情:

myElements = myXmlTree.findallelements("{" + ns + "}")

它会给我一个类似的返回值:

['registrationDate', 'ref', 'endAddress', 'handle', 'name', 'netBlocks', 'orgRef', 'comment', 'startAddress', 'updateDate', 'version']

如果它能告诉我元素的整个结构,包括嵌套的元素,那就特别棒了。

我确信有办法,否则就没有意义。

提前致谢!!

P.S.,我知道我可以迭代并浏览所有迭代的列表。我希望 lxml 中已经有一个包含这些数据的方法。如果迭代是唯一的方法,我想那没关系......对我来说这似乎很笨重。


我相信你正在寻找element.xpath() http://lxml.de/xpathxslt.html#the-xpath-method.

XPath http://en.wikipedia.org/wiki/XPath不是一个概念引入lxml而是一种用于从 XML 文档中选择节点的通用查询语言,受到许多处理 XML 的事物的支持。将其视为与 CSS 选择器类似的东西,但功能更强大(也更复杂一些)。看XPath 语法 http://www.w3schools.com/xpath/xpath_syntax.asp.

您的文档使用名称空间 - 我现在将忽略它,并在帖子末尾解释如何处理它们,因为这样可以使示例更具可读性。 (但它们不会按原样用于您的文档)。

所以,举例来说,

tree.xpath('/net/endAddress')

会选择<endAddress>79.255.255.255</endAddress>元素正下方<net />节点。但不是<endAddress />在 - 的里面<netBlock>.

XPath 表达式

tree.xpath('//endAddress')

但是会选择所有<endAddress />文档中任意位置的节点。

当然,您可以使用 XPath 表达式进一步查询返回的节点:

netblocks = tree.xpath('/net/netBlocks/netBlock')
for netblock in netblocks:
    start = netblock.xpath('./startAddress/text()')[0]
    end = netblock.xpath('./endAddress/text()')[0]
    print "%s - %s" % (start, end)

会给你

79.0.0.0 - 79.255.255.255

请注意.xpath()始终返回选定节点的列表 - 因此,如果您只想要一个,请考虑这一点。

您还可以通过元素的属性来选择元素:

comment = tree.xpath('/net/comment')[0]
line_2 = comment.xpath("./line[@number='2']")[0]

这将选择<line />元素与number="2"从第一条评论开始。

您还可以自己选择属性:

numbers = tree.xpath('//line/attribute::number')

['0', '1', '2']

要获取您上次询问的元素名称列表,您可以执行以下操作:

names = [node.tag for node in tree.xpath('/net/*')]

['registrationDate', 'ref', 'endAddress', 'handle', 'name', 'netBlocks', 'orgRef', 'comment', 'startAddress', 'updateDate', 'version']

但考虑到 XPath 的强大功能,最好只查询文档以获取您想从中了解的内容,具体或宽松取决于您认为合适。

现在,命名空间。正如您所注意到的,如果您的文档使用 XML 名称空间,则您需要在很多地方考虑到这一点,XPath 也不例外。查询命名空间文档时,您可以传递xpath()命名空间映射的方法如下:

NSMAP = {'ns':  'http://www.arin.net/whoisrws/core/v1',
         'ns2': 'http://www.arin.net/whoisrws/rdns/v1',
         'ns3': 'http://www.arin.net/whoisrws/netref/v2'}

names = [node.tag for node in tree.xpath('/ns:net/*', namespaces=NSMAP)]

在许多其他地方lxml您可以使用指定默认名称空间None作为命名空间映射中的字典键。不与xpath()不幸的是,这会引发异常

TypeError: empty namespace prefix is not supported in XPath

因此,不幸的是,您必须在 XPath 表达式中的每个节点名称前添加前缀ns:(或者您选择将该名称空间映射到的任何内容)。

有关 XPath 语法的更多信息,请参阅XPath 语法 http://www.w3schools.com/xpath/xpath_syntax.asp页面中的W3Schools Xpath 教程 http://www.w3schools.com/xpath/.

要开始使用 XPath,在众多文档之一中摆弄您的文档也非常有帮助。XPath 测试人员 http://chris.photobooks.com/xml/default.htm。此外,Firefox 的 Firebug 插件或 Google Chrome 检查器允许您显示所选元素的(或者更确切地说,众多之一)XPath。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 中使用 LXML 捕获 XML 文件的所有元素名称? 的相关文章

  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 如何使用sql作为xml路径('')但保留回车符

    我有下面的代码 select select cast Narrative as Varchar max char 13 from officeclientledger where ptmatter matter and ptTrans 4
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 为什么 XML 中的 CDATA 语法看起来如此奇怪?

    CDATA 在 XML 中的使用如下
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • 循环遍历日期范围内的所有月份?

    如果我有一个开始日期 比如说2009 02 01 和结束日期 比如2010 01 01 如何创建一个循环来遍历该范围内的所有日期 月份 Try start month strtotime 2009 02 01 end strtotime 2
  • Flux waitFor() 和异步操作,如何建模。

    我使用 pouchDB 作为应用程序的本地数据库 我想查询 PouchDB 的结果并将其加载到 React js 中 然而 即使我使用 waitFor 方法 PouchDB 查询的结果返回得太晚了 我想我不明白 waitFor 的用法是否正
  • 如何将 kotlin 协程与响应式 Spring 数据结合使用

    我正在尝试将一些项目从 Spring Reactor 迁移到 kotlin 协程 我有一些基于 spring webflux 的控制器 如下所示 RestController class Controller val productRepo
  • IIS 7.5 上的 ASP.NET MVC - 错误 403.14 禁止

    我正在使用 Visual Studio 2010 RC 运行 Windows 7 Ultimate 64 位 我最近决定让 VS 在 IIS 上运行 调试我的应用程序 而不是在它附带的开发服务器上 但是 每次我尝试运行 MVC 应用程序时
  • 如何在我的 Phonegap 应用程序中升级 Phonegap?

    我有一个 Phonegap 应用程序 是从早期版本的 Phonegap 启动的 我想将其升级到最新版本 我需要采取哪些步骤来升级它 我正在寻找一般答案 但我的具体情况是 Phonegap 1 1 0 gt 1 2 0 我今晚发现了这个 看起
  • 使用反应虚拟化和新的 CellMeasurer 实现动态行高

    我正在使用带有 Autosizer List 和 CellMeasurer 组件的 React Virtualized 9 当列表数据更改时 我需要更新行高 看来 自从版本 9 中支持 React Fiber 的更改以来 CellMeasu
  • “by viewModels()”Kotlin 属性委托未解析的引用

    我正在尝试用 kotlin 实现 viewmodel 首先我添加了所需的依赖项 implementation androidx appcompat appcompat 1 1 0 implementation androidx core c
  • 更改区域设置:强制活动重新加载资源?

    所以我的应用程序中有一个语言设置 切换语言时 我希望所有文本视图等立即更改语言 目前我只是更改配置中的区域设置 因此当用户重新启动活动时语言已更改 我的问题的一个丑陋的解决方案是让每个文本视图在每次更改语言时加载新资源 有更好的解决方案吗
  • git stash apply 和 git stash apply --index 有什么区别?

    每当我跑步时git stash apply and git stash apply index完成后git stash a即使我的 WIP 目录有暂存的更改 未暂存的 但跟踪的更改 和未跟踪的文件 我也会得到相同的结果 这是正常的吗 不应该
  • 将 XML 转换为带属性的 ruby​​ 哈希

    客观的 将 XML 转换为 ruby Hash 包含所有节点和属性值 我尝试了什么 xml
  • ASP.Net Core 回发后如何保持选项卡处于活动状态

    我有一个视图 其中包含一组选项卡 每个选项卡呈现不同的部分视图 阅读这些引导选项卡的文档和 W3Schools 示例后 我无法找到一种方法使活动选项卡在回发时保持活动状态 我见过的所有示例都使用旧版本的 Net 并且也不适用 这是我的代码
  • 类型错误:$.browser 未定义

    我正在使用 msdropdown 图像组合框来创建下拉选择选项 当我在我的电脑上本地运行此代码时 一切都运行良好 但是当我在 GoDaddy 服务器上运行它时 msdropdown 被禁用 它不适用于任何浏览器 Firebug 将错误显示为
  • Rust 双与号,&&

    我看到一些代码如下所示 fn test lt a gt a mut a str 我知道 a 是一生 而 是引用 但是我很难理解双重引用 根据我的理解 引用是一个指针 那么 是指向另一个指针还是其他指针的指针 根据我的理解 引用是一个指针 是
  • Gitlab:无法识别对等方的证书颁发者

    我在全新安装 gitlab 时遇到此错误 该消息如下所示 fatal unable to access https gitlab ci token email protected cdn cgi l email protection som
  • 用于事件驱动通信的 SQL CLR

    我工作的地方他们正在使用长轮询检测数据库中发生的事件的技术 虽然它有效 我认为每个人都会同意轮询数据库并不是最佳选择 我宁愿尝试某种推送技术或技巧 因此 我正在考虑使用表触发器打电话给SQL CLR将事件放入队列或调用 Web 服务的对象
  • Angular 子组件 ng-invalid

    我正在创建一个自定义输入组件 该组件通过实现实现形式兼容ControlValueAccessor 该输入组件是一个或多个子输入的组合 但我无法获取ng invalid要传播给子级的 CSS 类input元素 我的自定义输入组件有一个类似的模
  • ASP MVC Less 文件给出: 调用目标已引发异常

    我有一个简单的 asp net mvc 4 站点 使用较少的文件 当我在本地电脑上运行它时 它工作正常 但是当我将其发布到服务器时 我收到以下错误 During the output text content of processed as
  • 更改 iframe 上的鼠标光标

    我想将鼠标光标从手动状态取消为默认状态 其中出现白色箭头 我有一个简单的 iframe 但我认为 iframe 内有一个链接导致光标更改为指针 手 我该如何更改该行为 这不起作用 iframe cursor default 如果您可以访问
  • R 防止饼图中重叠

    我的数据是这样的 VariantClass PASS ONTARGET Silent 50 30 Missense 47 00 Nonsense 0 74 Startloss 0 26 Stoploss 0 74 Frameshift in
  • 如何在 Python 中使用 LXML 捕获 XML 文件的所有元素名称?

    我能够使用 lxml 来完成我想做的大部分事情 尽管浏览令人困惑的示例和教程很困难 简而言之 我能够读取外部 xml 文件并通过 lxml 将其导入正确的树状格式 为了证明这一点 如果我输入 print etree tostring myX