【问题标题】:How to lookup element in AWS response with lxml (namespace issue?)如何使用 lxml 查找 AWS 响应中的元素(命名空间问题?)
【发布时间】:2014-02-04 19:24:41
【问题描述】:

我正在尝试使用 lxml 从 AWS REST API 读取响应,但没有任何运气。我可以轻松地解析响应并打印它,但是find 或xpath 函数都找不到任何东西。以这个文档片段为例:

<DistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2013-11-11/">
  <CallerReference>e6d6909d-f1ed-47f1-83d9-290acf10f324</CallerReference>
  <Aliases>
    <Quantity>1</Quantity>
    <Items>

还有这段代码:

from lxml import etree
root = etree.XML( ... )
node = root.find( 'Quantity' ) 

node 始终是None。我尝试了各种 xpath,例如 //Quanity、.//Quantity 以及 xpath 函数,但找不到任何东西。

我如何在这种类型的文档上使用这个库?

【问题讨论】:

  • find 不会下降到这里。也许root.find('Aliases/Quantity') 可以?
  • 你也可以使用通配符Aliases(使用root.find('*/Quantity');我认为应该可以)。

标签: python lxml


【解决方案1】:

看来您还需要提供元素的命名空间:

>>> root.find('.//aws:Quantity', namespaces={'aws': 'http://cloudfront.amazonaws.com/doc/2013-11-11/'})
<Element {http://cloudfront.amazonaws.com/doc/2013-11-11/}Quantity at 0xb6c16aa4>

【讨论】:

  • 好吧,这似乎行得通。你知道是否有为整个文档指定一个namespaces 映射?我不希望每次通话都输入该部分。
  • 嗯,root.filter 调用中namespaces 参数的值只是一个字典。您可以将该字典分配给一个变量并重复使用它 (root.find('...', namespaces=nsdict))。
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2011-09-28
  • 2011-07-26
  • 2011-10-15
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多