Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有元素_Java_Html_Jsoup - Fatal编程技术网

Java Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有元素

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

假设我有如下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 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”)