2011-02-11 54 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