Jsoup - извлечение текста

мне нужно извлечь текст из такого узла:

<div>
    Some text <b>with tags</b> might go here.
    <p>Also there are paragraphs</p>
    More text can go without paragraphs<br/>
</div>

и мне нужно построить:

Some text <b>with tags</b> might go here.
Also there are paragraphs
More text can go without paragraphs

Element.text возвращает только все содержимое div. Element.ownText - все, что не внутри дочерних элементов. Оба ошибаются. Переборем children игнорирует текстовые узлы.

есть ли способ перебирать содержимое элемента для получения текстовых узлов. Е. Г.

  • текстовый узел-Некоторый текст
  • узел - с теги
  • текстовый узел - может зайти сюда.
  • Node

    - также есть абзацы

  • текстовый узел - больше текста может идти без абзацев
  • узел
    -

4 ответов



for (Element el : doc.select("body").select("*")) {

        for (TextNode node : el.textNodes()) {

                    node.text() ));

        }

    }

Если вы хотите только текст (без тегов) мое решение ниже.
Выход есть:
Здесь может быть текст с тегами. Также есть параграфы. Больше текста может идти без абзацев

public static void main(String[] args) throws IOException {
    String str = 
                "<div>"  
            +   "    Some text <b>with tags</b> might go here."
            +   "    <p>Also there are paragraphs.</p>"
            +   "    More text can go without paragraphs<br/>" 
            +   "</div>";

    Document doc = Jsoup.parse(str);
    Element div = doc.select("div").first();
    StringBuilder builder = new StringBuilder();
    stripTags(builder, div.childNodes());
    System.out.println("Text without tags: " + builder.toString());
}

/**
 * Strip tags from a List of type <code>Node</code>
 * @param builder StringBuilder : input and output
 * @param nodesList List of type <code>Node</code>
 */
public static void stripTags (StringBuilder builder, List<Node> nodesList) {

    for (Node node : nodesList) {
        String nodeName  = node.nodeName();

        if (nodeName.equalsIgnoreCase("#text")) {
            builder.append(node.toString());
        } else {
            // recurse
            stripTags(builder, node.childNodes());
        }
    }
}

вы можете использовать TextNode для этого:

List<TextNode> bodyTextNode = doc.getElementById("content").textNodes();
    String html = "";
    for(TextNode txNode:bodyTextNode){
        html+=txNode.text();
    }