在 Python 中是否有更好的方法来分配 lxml xpath() 的第一个结果?
In Python is there a better way to assign the first result from lxml xpath()?
我正在努力转换我的一些脚本,这些脚本将 XML 文档从 Perl 转换为 Python。
在 Perl 中使用 XML::LibXML 我可以做到
my ($target) = $dom->findnodes('/root/child1');
分配返回的节点列表中的第一个节点。
在 Python 到目前为止,我已经开始工作了:
target = (tree.xpath('/root/child1'))[0]
但我想知道是否有更好或更像 Python 的方法来做到这一点。
如果您确定 root
下总是只有一个 child1
节点,您可以从 xpath
分配返回列表的第一项使用 iterable unpacking:
直接将方法写入变量
target, = tree.xpath('/root/child1')
或者如果输入中 root
下可能有多个 child1
节点,您可以使用带星号的表达式将其余匹配节点解压缩到一个未使用的变量中,通常按照约定命名为 _
:
target, *_ = tree.xpath('/root/child1')
可迭代解包通常被认为比通过索引指定列表项更符合 Pythonic,除非您需要在任意索引处直接指定一个项目。
这是一种正常且合理的方法(除了去掉不需要的括号)。尽可能在 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
(它们非常相似)。它找到第一个匹配元素和 returns。 ElementPath
还有其他方法,如 iterfind
用于处理大型文档。
我正在努力转换我的一些脚本,这些脚本将 XML 文档从 Perl 转换为 Python。
在 Perl 中使用 XML::LibXML 我可以做到
my ($target) = $dom->findnodes('/root/child1');
分配返回的节点列表中的第一个节点。
在 Python 到目前为止,我已经开始工作了:
target = (tree.xpath('/root/child1'))[0]
但我想知道是否有更好或更像 Python 的方法来做到这一点。
如果您确定 root
下总是只有一个 child1
节点,您可以从 xpath
分配返回列表的第一项使用 iterable unpacking:
target, = tree.xpath('/root/child1')
或者如果输入中 root
下可能有多个 child1
节点,您可以使用带星号的表达式将其余匹配节点解压缩到一个未使用的变量中,通常按照约定命名为 _
:
target, *_ = tree.xpath('/root/child1')
可迭代解包通常被认为比通过索引指定列表项更符合 Pythonic,除非您需要在任意索引处直接指定一个项目。
这是一种正常且合理的方法(除了去掉不需要的括号)。尽可能在 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
(它们非常相似)。它找到第一个匹配元素和 returns。 ElementPath
还有其他方法,如 iterfind
用于处理大型文档。