2010-07-04 79 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