我收到了HTML文件:
<div>test</div>
abc
<content >
<!--alo 123-->
<div>content alo 123 here</div>
</content>
yes
<div>test</div>
我正试图在这些标签之间得到所有内容(例如:inlude text):
abc
<content >
<!--alo 123-->
<div>content alo 123 here</div>
</content>
yes
我在java中获得了这段代码:
previousTag=selectedTag.previousElementSibling();
nextTag=selectedTag.nextElementSibling();
我尝试在previousTag之后添加:
previousTag.append("<gf>");
nextTag.before("</gf>");
但是之前的标签会自动添加&#34; </gf>
&#34;。而nextTag没有做任何事情。
我还试图在prevoiusTag之后获得所有内容:
int iPrevious=previousTag.elementSiblingIndex();
Elements selection=previousTag.getElementsByIndexGreaterThan(iPrevious);
试图在&#34; prevoiusTag&#34;&#34; nextTag&#34;之后获取所有内容,但它最终无效。 我查看了另一篇有相同问题的文章,但无法应用。 他们知道他们的标签是什么。 我避免使用循环for list_sibling_nodes。 有谁知道如何提取2个随机标签之间的所有内容??
答案 0 :(得分:1)
它们是解决问题的两种选择。
Jsoup将为您处理所有肮脏的工作。如果您对兄弟TextNodes
不感兴趣,此方法只能 。
div:containsOwn(test):first-of-type ~ *:not(div:containsOwn(test), div:containsOwn(test):last-of-type ~ *)
请记住:由于*
运算符仅匹配元素,因此文本节点无法匹配。
<强> 说明 强>
div:containsOwn(test) /* Select a div containing directly the text `test` */
:first-of-type /* Keep only the first div found (1) */
~ * /* Select all siblings of (1) ... */
:not( /* ... excluding ... */
div:containsOwn(test) /* ... any div containing directly the text `test` */
, /* OR */
div:containsOwn(test):last-of-type ~ *) /* any sibling after the second div (second random tag) */
) /* :not operator closing parenthesis */
下面的代码在您选择的两个元素(两个随机标记)之间手动检查每个兄弟节点。它在找到第二个随机元素时停止。
String firstRandomElementSelector = "div:containsOwn(test):first-of-type";
String secondRandomElementSelector = "div:containsOwn(test):last-of-type";
Document doc = ...;
Element firstRandomElement = select(doc, firstRandomElementSelector);
Element secondRandomElement = select(doc, secondRandomElementSelector);
List<Node> siblingNodes = firstRandomElement.siblingNodes();
List<Node> nodesInBetween = new ArrayList<>();
Node currentNode = firstRandomElement;
do {
Node nextSibling = currentNode.nextSibling();
if (nextSibling == null) {
break;
}
if (secondRandomElement.equals(nextSibling)) {
break;
}
nodesInBetween.add(nextSibling);
currentNode = nextSibling;
} while(true);
for(Node node : nodesInBetween) {
System.out.println(node.outerHtml() + "---");
}
// Helper method
private static Element select(Document doc, String cssSelector) {
Element element = doc.select(cssSelector).first();
if (element == null) {
throw new RuntimeException("Unable to locate any element matching:" + cssSelector);
}
}