Java Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有元素
假设我有如下html:Java Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有元素,java,html,jsoup,Java,Html,Jsoup,假设我有如下html: <div class="pets"> <div class="pet">...</div> <div class="pet">...</div> <div class="pet">...</div> <div class="pet">...</div> <div class="friends-pets">Your friends ha
<div class="pets">
<div class="pet">...</div>
<div class="pet">...</div>
<div class="pet">...</div>
<div class="pet">...</div>
<div class="friends-pets">Your friends have these pets:</div>
<div class="pet">...</div>
<div class="pet">...</div>
<div class="pet">...</div>
<div class="pet">...</div>
<div class="pet">...</div>
<div class="pet">...</div>
</div>
Element petsWrapper = document.selectFirst(".pets");
Elements pets = petsWrapper.select(".pet");
但这也包括额外的宠物。我想知道我是否只能选择上面的宠物,或者只是删除下面的宠物,然后使用该代码?注释中的解释:
Element petsWrapper = document.selectFirst(".pets");
Elements pets = petsWrapper.select(".pet");
// select middle element
Element middleElement = petsWrapper.selectFirst(".friends-pets");
// remove from "pets" every element that comes after the middle element
pets.removeAll(middleElement.nextElementSiblings());
System.out.println(pets);
我想看看Krystian的答案,但在我自己尝试解决这个问题后,我想到了这个:
//get all divs
Elements divElements = doc.select("div");
//valid pet divs will be here
List<Element> pets = new ArrayList<>();
for (Element divElement: divElements) {
if (divElement.className().equalsIgnoreCase("friends-pets")) {
//invalid div, the cycle stops here
break;
}
if (divElement.className().contains("pet")) {
//if there has been no invalid div so far, adding a pet
pets.add(divElement);
}
}
//获取所有div
元素divElements=doc.select(“div”);
//这里有有效的宠物分类
List pets=new ArrayList();
对于(元素divElement:divElements){
if(divElement.className().equalsIgnoreCase(“朋友的宠物”)){
//无效的div,循环在此停止
打破
}
如果(divElement.className()包含(“pet”)){
//如果到目前为止还没有无效的div,添加宠物
pets.add(divElement);
}
}
如果你认为这个答案有问题,请告诉我。如果你有理由认为我应该使用当前两个答案中的一个而不是另一个,请也发表评论 有一种非常简单的方法,您可以使用一个选择器来完成此操作:
.pet:not(.friends-pets ~ .pet)
这是通过使用:not()
和.friends pets~.pet
查找.friends pets
类后的每个div来实现的。然后,它将这些从其余的.pet
类匹配中排除
请参见此处的联机工作示例:类
元素
继承自ArrayList
。我在堆叠元素时遇到类似问题,这似乎是解决此问题的另一种有效方法。我仍然会使用需要两行代码的解决方案,而不是迭代和检查条件。当您想检查更复杂的内容时,您的答案可能更合适,例如:className().contains(“xxx”)| className().contains(“yyy”)&&!className()包含(“zzz”)| className.matches(“abc\\d\\dxyz”)