[英]How to get the nth previous or next element in Jsoup
无论如何,是否有可能使用jsoup获取第n个上一个或下一个特定HTML元素,该元素可能处于不同的嵌套级别?
<div style="position: relative;"> <div class="wmd-container"> <div id="wmd-button-bar-42" class="wmd-button-bar"></div> <input id="previousInput" name="communitymode" type="checkbox"> </div> </div> <div class="fl" style="margin-top: 8px; height: 24px;"> </div> <div id="draft-saved-42" class="draft-saved community-option fl" style="margin-top: 8px; height: 24px; display: none;">draft saved </div> <div id="draft-discarded-42">draft discarded</div> <div class="community-option g-row ai-center f-checkbox"> <div class="g-col -input"> <input id="NextInput" name="communitymode"> </div> <div class="g-col"> <label for="communitymode-42">community wiki</label> </div> </div>
例如,在下面的HTML中,我指向元素:
<div id="draft-discarded-42">draft discarded</div>
通过使用下面的代码。
Element elem = doc.select("div[id=draft-discarded-42]").first();
我想要前面的第一个 input
元素:
<input id="previousInput" name="communitymode" type="checkbox">
还有第二个 div
:
<div class="fl" style="margin-top: 8px; height: 24px;"> </div>
第二个 div
:
<div class="g-col -input"> <input id="NextInput" name="communitymode"> </div>
除非您不知道id
属性的值或可用于标识元素的任何属性,否则应使用选择器语法来获取所需的元素。
但是,如果您有一个模糊的想法/不知道元素的属性,但是知道它与指向的元素有关,则可以使用以下功能:
public static Element selectNthElementBefore(Element origin, String query, int count) {
Element currentElement = origin;
Evaluator evaluator = QueryParser.parse(query);
while ((currentElement = currentElement.previousElementSibling()) != null) {
int val = 0;
if (currentElement.is(evaluator)) {
if (--count == 0) {
return currentElement;
}
val++;
}
Elements elems = currentElement.select(query);
if (elems.size() > val) {
int childCount = elems.size() - val;
int diff = count - childCount;
if (diff == 0) {
Element prevElement = elems.first();
currentElement = prevElement.children().select(query).first();
while (currentElement != prevElement) {
if (currentElement == null) {
return prevElement;
}
prevElement = currentElement;
currentElement = currentElement.children().select(query).first();
}
}
if (diff > 0) {
count -= childCount;
}
if (diff < 0) {
return elems.get(childCount - count);
}
}
}
if (origin.parent() != null && currentElement == null) {
if (origin.parent().is(evaluator)) {
if (--count == 0) {
return origin.parent();
}
}
return selectNthElementBefore(origin.parent(), query, count);
}
return currentElement;
}
public static Element selectNthElementAfter(Element origin, String query, int count) {
Element currentElement = origin;
Evaluator evaluator = QueryParser.parse(query);
while ((currentElement = currentElement.nextElementSibling()) != null) {
int val = 0;
if (currentElement.is(evaluator)) {
if (--count == 0)
return currentElement;
val++;
}
Elements elems = currentElement.select(query);
if (elems.size() > val) {
int childCount = elems.size() - val;
int diff = count - childCount;
if (diff == 0) {
return elems.last();
}
if (diff > 0) {
count -= childCount;
}
if (diff < 0) {
return elems.get(childCount + diff);
}
}
}
if (origin.parent() != null && currentElement == null) {
return selectNthElementAfter(origin.parent(), query, count);
}
return currentElement;
}
Element elem = doc.getElementById("draft-discarded-42");
Element firstPrevInput = selectNthElementBefore(elem, "input", 1);
Element secPrevDiv = selectNthElementBefore(elem, "div", 2);
Element secNextDiv = selectNthElementAfter(elem, "div", 2);
System.out.println("#### First previous input ####");
System.out.println(firstPrevInput.toString());
System.out.println("##############################\n");
System.out.println("#### Second previous div ####");
System.out.println(secPrevDiv.toString());
System.out.println("#############################\n");
System.out.println("#### Second next div ####");
System.out.println(secNextDiv.toString());
System.out.println("#########################");
#### First previous input ####
<input id="previousInput" name="communitymode" type="checkbox">
##############################
#### Second previous div ####
<div class="fl" style="margin-top: 8px; height: 24px;">
</div>
#############################
#### Second next div ####
<div class="g-col -input">
<input id="NextInput" name="communitymode">
</div>
#########################
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.