【问题标题】:In Python is there a better way to assign the first result from lxml xpath()?在 Python 中有没有更好的方法来分配 lxml xpath() 的第一个结果?
【发布时间】:2021-07-15 01:01:06
【问题描述】:

我正在努力转换一些将 XML 文档从 Perl 转换为 Python 的脚本。

在 Perl 中使用 XML::LibXML 我可以做到

my ($target) = $dom->findnodes('/root/child1');

从返回的节点列表中分配第一个节点。

到目前为止,在 Python 中,我得到了这个工作:

target = (tree.xpath('/root/child1'))[0]

但我想知道是否有更好或更类似于 Python 的方法来做到这一点。

【问题讨论】:

  • 如果您的 Python 版本足够新,您可以使用 target, *_ = tree.xpath('/root/child1'),但我不知道这是否真的更好。

标签: python lxml


【解决方案1】:

这是一种正常且合理的方法(除了去掉不需要的括号)。尽可能在 xpath 中进行选择是很常见的,这样lxml 就不必创建额外的对象,

target = tree.xpath('/root/child1[1]')[0]

或者假设您已经处于文档的根级别,则跳过根规范

target = tree.xpath('child1[1]')[0]

但我认为最常见的选择是改用find 方法。

target = tree.find('child1')

find 来自ElementTree API,使用ElementPath 而不是XPath(它们非常相似)。它找到第一个匹配的元素并返回。 ElementPath 有其他方法,如 iterfind 用于处理大型文档。

【讨论】:

    【解决方案2】:

    如果您确定在root 下总是只有一个child1 节点,您可以使用@ 将xpath 方法的返回列表的第一项直接分配给变量987654321@:

    target, = tree.xpath('/root/child1')
    

    或者如果在您的输入中root 下可能有多个child1 节点,您可以使用星号表达式将其余匹配节点解压缩到未使用的变量中,通常命名为_ 按照惯例:

    target, *_ = tree.xpath('/root/child1')
    

    可迭代解包通常被认为比通过索引指定列表项更具 Pythonic,除非您需要直接在任意索引处指定项目。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2020-06-10
      • 1970-01-01
      • 2019-06-02
      • 2023-03-15
      相关资源
      最近更新 更多