【问题标题】:XPath and lxml syntaxXPath 和 lxml 语法
【发布时间】:2010-07-04 20:27:30
【问题描述】:

我有一个结构如下所示的 XML 文件:

<x>
   <y/>
   <y/>
   .
   .
</x>

&lt;y&gt; 标签的数量是任意的。

我想获得&lt;y&gt; 标签的文本,为此我决定使用XPath。我已经弄清楚了语法,比如说第一个y:(假设rootx

textFirst = root.xpath('y[1]/text()')

这按预期工作。

但是我的问题是我不会事先知道&lt;y&gt; 标签的数量,所以为了解决这个问题,我这样做了:

>>> count = 0
>>> for number in root.getiterator('y'):
...     count += 1

所以现在我知道x 中有count 的数量y。 (有没有更好的获取标签数量的方法?如果有,请建议)

但是,如果我这样做:

>>> def try_it(x):
...     return root.xpath('y[x]/text()')
... 
>>> try_it(1)
[]

它返回一个空列表。

所以我的问题是:不知道任意数量的标签,我如何获得它的 XPath 语法或表达式并使用lxml

抱歉,如果有什么不清楚的地方,我已尽力解释问题。

【问题讨论】:

    标签: python xpath lxml


    【解决方案1】:

    'y[%i]/text()' % x 呢?

    现在你明白你在哪里做错了吗? :)

    ( .. 请注意,您可以将所有 y 元素与 xpath 'y''//y' 一起捕获)

    【讨论】:

    • 噢噢噢噢!有用!太感谢了。我太傻了。我获取y 标签数量的方法是否可以,或者是否有更短的版本?
    • PulpFiction:它发生了 :) 我已经更新了答案,提示如何更简单地做到这一点
    • mykhal:感谢您的帮助,您为我省去了很多劳力。祝你有美好的一天! :)
    【解决方案2】:

    要计算y 节点的数量,可以使用XPath 表达式'count(/x/y)'

    另外,我认为您在 try_it 函数中的表达式的问题在于您似乎使用文字值 x 而不是将输入参数连接到 XPath 表达式中。

    也许这样的事情会起作用:

     >>> def try_it(x):
    ...     return root.xpath('y[' + x + ']/text()')
    

    希望这会有所帮助!

    【讨论】:

    • count() 正是我所需要的。谢谢你的回复。
    • 为什么 count() 返回浮点数?
    • @PulpFiction - lxml 为任何返回数字结果的 XPath 表达式返回浮点数(在 Java 中,相应的结果是 Double)。您应该可以将其降级。
    • 谢谢,我能做到,但我只是好奇为什么它会返回一个浮点数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2017-03-29
    • 2010-12-07
    • 2016-10-24
    • 2012-08-23
    相关资源
    最近更新 更多