如何解决Jsoup:获取某个元素之前的所有元素/删除某个元素之后的所有堆叠元素
这个问题有另一个版本,我将用它来建立我的 Jsoup: get all elements before a certain element / remove all elements after a certain element
我想获取 .friend-pets 之前的所有 .pet。我尝试使用原始问题中提出的解决方案,但在此用例中遇到此结果。
输入:
<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);
顺便说一句,我是上一个答案的作者;)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。