Select 选择Jsoup中的最后x个子项

Select 选择Jsoup中的最后x个子项,select,jsoup,children,Select,Jsoup,Children,在本例中,我尝试使用Jsoup获取表的最后x行,最后5行。但在选择最后5个子项之前,我需要对选择器查询应用一些过滤器 Elements ptr = ptable.select("tr:gt(0):contains("+patern+")"); 这是我必须首先选择的。因为表中包含很多不必要的行,所以我过滤第一行,其中包含列的标题,为了去除无用的行,我使用patern文本来选择我需要的行。这部分工作没有问题 在这一步之后,我需要从其余元素中获得最后5个结果。我试过这个 Elements ptr =

在本例中,我尝试使用Jsoup获取表的最后x行,最后5行。但在选择最后5个子项之前,我需要对选择器查询应用一些过滤器

Elements ptr = ptable.select("tr:gt(0):contains("+patern+")");
这是我必须首先选择的。因为表中包含很多不必要的行,所以我过滤第一行,其中包含列的标题,为了去除无用的行,我使用patern文本来选择我需要的行。这部分工作没有问题

在这一步之后,我需要从其余元素中获得最后5个结果。我试过这个

Elements ptr = ptable.select("tr:gt(0):contains("+patern+"):nth-last-child(-n+5)");
但它不起作用。试过第n个孩子,但仍然不起作用。作为最后的结果,我尝试了

Elements ptd = ptr.select("td:nth-last-child(-n+"+Integer.toString(ptd1.size()*5)+")");
选择td的结果,但仍然不起作用。 ptd1.size返回列计数

好吧,在应用了我想要的过滤器之后,我最终没有得到最后5个元素。在我应用过滤器gt0并包含+patern+后,是否仍有选择它们的方法


ps.表格内容是动态的,所以我不能跳过前x行以获得最后5行。

最简单的解决方案是从匹配元素的筛选列表中创建一个子列表。我用Groovy编写了一个简单的示例—您可以看到,首先,您过滤掉所有不感兴趣的行:

Elements elements = document.select('table#test tr:contains(ID)')
在本例中,为了简单起见,我们对不包含ID关键字的行不感兴趣。然后,我们只需从过滤元素列表中选取最后n个元素:

int numberOfLastElements = 3
List<Element> sublist = elements.subList(elements.size() - numberOfLastElements, elements.size())
这个简单的断言是为了测试而添加的,您不应该将它添加到生产代码中。它只检查筛选子列表中的每个元素是否在第一个td元素中包含一个给定内容


这个例子是用Groovy编写的,Java解决方案几乎是一样的。

我使用过这个代码Elements sublist=Elements ptr.subListptr.size-5,ptr.size;但我犯了这个错误。我做错什么了吗?java.lang.ClassCastException:java.util.AbstractList$SubAbstractListRandomAccess不能强制转换为org.jsoup.select.element这是我的错误-在java中,它应该类似于List sublist=ptr.subListptr.size-5,ptr.size;。Groovy在case List->Elements中做得很好,这要感谢它对动态语言的改进,但在Java中它必须是静态正确的。我已经在要点中修改了答案和代码示例。很抱歉给您带来不便。我很高兴能帮助您:
assert sublist.every {
    ['ID: 4', 'ID: 5', 'ID: 6'].contains(it.select('td:first-child').html())
}