2010-07-04 61 views
0

我有结构的XML文件,如下所示:XPath和LXML语法

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

<y>标签的数目是任意的。

我想要得到<y>标签的文本,为此我决定使用XPath。我已经想通了语法,说的第y:(假设rootx

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

可正常工作。

但是我的问题是,我不知道要事先的标签<y>的数量,所以要解决这个问题,我这样做:

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

所以,现在我知道有在count一些yx。 (有没有更好的方式来获得标签的数量如果是,请建议?)

但是,如果我这样做:

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

它返回一个空列表。

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

对不起,如果有什么不清楚,我尽我所能解释这个问题。

回答

1

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

现在你看到你在哪里做错了? :)

(..请注意,您可以捕获所有的Y元素结合在一起使用XPath 'y''//y'

+0

Ohhhhhhh!有用!非常感谢。非常愚蠢的我。 我的方法是获取'y'标签的数量还是有一个较短的版本? – user225312 2010-07-04 20:38:02

+0

PulpFiction:它发生了:)我已经用简单的方式更新了答案,如何更简单地做到这一点 – mykhal 2010-07-04 20:42:38

+0

mykhal:谢谢你的帮助,你为我节省了很多辛苦。祝你有美好的一天! :) – user225312 2010-07-04 20:48:35

1

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

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

也许像这样的工作:

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

希望这有助于!

+0

count()正是我所需要的。感谢您的答复。 – user225312 2010-07-04 20:43:22

+0

为什么count()返回float? – user225312 2010-07-04 21:01:27

+0

@PulpFiction - 对于任何返回数值结果的XPath表达式,lxml返回float(在Java中,相应的结果是一个Double)。你应该能够贬低它。 – mlschechter 2010-07-04 21:28:30