【问题标题】:Jsoup: get all elements before a certain element / remove all stacked elements after a certain elementJsoup:获取某个元素之前的所有元素/删除某个元素之后的所有堆叠元素
【发布时间】:2021-07-02 08:38:30
【问题描述】:

这个问题有另一个版本,我将用它来作为我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'

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

谢谢。

【问题讨论】:

    标签: java html jsoup html-parsing


    【解决方案1】:

    我的方法是使用一个选择器选择您想要的和不想要的。您可以使用逗号 , 加入选择器,因此它将作为 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);
    

    顺便说一句,我是之前那个答案的作者;)

    【讨论】:

    • 效果很好。我的问题是我认为在 jsoup 中已经实现了一些东西,我没有考虑使用列表。非常感谢您的帮助。
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多