簡體   English   中英

Jsoup:獲取某個元素之前的所有元素/刪除某個元素之后的所有堆疊元素

[英]Jsoup: get all elements before a certain element / remove all stacked elements after a certain element

這個問題有另一個版本,我將用它來建立我的 Jsoup:獲取某個元素之前的所有元素/刪除某個元素之后的所有元素

我想得到在.friend-pets 之前的all.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'

所以我無法真正測試它是否真的有效。

謝謝你。

我的方法是 select 你想要什么和你不想要一個選擇器。 您可以使用逗號連接選擇器,因此它將用作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);

順便說一句,我是之前那個答案的作者;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM