Jsoup:提取2个随机标签之间的所有内容

时间:2016-05-08 02:29:10

标签: java html jsoup

我收到了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个随机标签之间的所有内容??

1 个答案:

答案 0 :(得分:1)

它们是解决问题的两种选择。

选项1:CSS查询方法

Jsoup将为您处理所有肮脏的工作。如果您对兄弟TextNodes不感兴趣,此方法只能

div:containsOwn(test):first-of-type ~ *:not(div:containsOwn(test), div:containsOwn(test):last-of-type ~ *)

请记住:由于*运算符仅匹配元素,因此文本节点无法匹配。

DEMO

<强> 说明

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 */

选项2:API方法

下面的代码在您选择的两个元素(两个随机标记)之间手动检查每个兄弟节点。它在找到第二个随机元素时停止。

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);
   }
}