Jsoup:获取某个元素之前的所有元素/移除某个元素之后的所有堆叠元素



这个问题有另一个版本,我将使用它来构建Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有元素

我想得到在.朋友宠物之前的所有.宠物。我尝试使用原始问题中提出的解决方案,但在这个用例中遇到了这个结果。

输入:

<div class="pets">
<div>
<div class="pet">1</div>
<div class="pet">2</div>
</div>
<div class="pet">3</div>
<div class="friends-pets">Your friends have these pets:</div>
<div class="pet">4</div>
<div>
<div class="pet">5</div>
<div class="pet">6</div>
</div>
<div>

预期:

<div class="pet">1</div>
<div class="pet">2</div>
<div class="pet">3</div>

实际:

<div class="pet">1</div>
<div class="pet">2</div>
<div class="pet">3</div>
<div class="pet">5</div>
<div class="pet">6</div>

当我运行时会发生这种情况

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);

因为nextSiblings((方法只获取属于同一父级的元素。当我使用css选择器时,就像第二个答案中建议的那样:

.pet:not(.friends-pets ~ .pet)

我得到这个错误:

Did not find balanced marker at '.friends-pets ~ .pet'

所以我真的无法测试它是否真的有效。

谢谢。

我的方法是用一个选择器选择你想要的和不想要的。您可以使用逗号,连接选择器,这样它就可以作为AND运算符工作。元素的顺序将被保留,并且你将有一个所有元素的列表";在相同的水平上";没有父母。那么你只能得到这个列表的前半部分。

Elements goodElementsWithBadElement = document.select(".pet,.friends-pets");
Element badElement = goodElementsWithBadElement.select(".friends-pets").first();
int positionOfBadElement = goodElementsWithBadElement.indexOf(badElement);
List<Element> onlyWhatYouWant = goodElementsWithBadElement.subList(0, positionOfBadElement);
System.out.println(onlyWhatYouWant);

顺便说一句,我是上一个答案的作者;(

最新更新