2011-02-11 55 views
3

在lxml中,我使用xpath來選擇表中所有tr(具有不同數量的行)的tr,除了最後兩行包含亂碼。如何選擇除最後兩個tr之外的所有tr

是否存在排除最後兩行的模式匹配?我正在瀏覽xpath教程,顯然有一個「除」運算符和一個「最後()」,但似乎無法讓我的代碼工作。

到目前爲止,我有這個。我爲了排除最後兩行而添加到這個模式中?主要問題是tr的數量有所不同。

result = doc.xpath("//tr") 

我想我可以把它變成一個列表,只是刪除了最後兩個元素,但沒有任何容易/優雅的解決方案?

提前致謝!

+0

好問題,+1。查看我的答案,獲取純XPath解決方案(單個單行表達式),選擇所有需要的'tr'元素。 :) –

回答

2
result = doc.xpath("//tr")[0:-2] 

應該這樣做。

+0

作品,謝謝!我的代碼縮短了很多。 – chesspro

9

使用

expressionSelectingTheTable/tr[not(position() > last() -2)] 

其中expressionSelectingTheTable應與選擇表,對於該問題被要求(如//table[@id='foo']

此單個XPath表達式的特定XPath表達式被取代選擇table家長的所有tr子女,其子女不是最後兩名中的一員。

+0

嗯有趣,不知道你可以做position()> last()。我以爲你只能有一個或另一個。謝謝! – chesspro

+2

@chesspro:它實際上是'not(position()> last()-2)',是的,'position()'和'last()'函數可以參與* any * XPath表達式。像not(position()= last())這樣的表達式經常被使用。 –

+1

+1好答案。 – 2011-02-12 14:14:37