8

次のようなノードからテキストを抽出する必要があります。

<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.textdivのすべてのコンテンツのみを返します。Element.ownText-子要素の内部にないものすべて。どちらも間違っています。繰り返し処理すると、childrenテキストノードは無視されます。

要素のコンテンツを繰り返してテキストノードも受け取る方法はありますか?例えば

  • テキストノード-一部のテキスト
  • ノード<b>-タグ付き
  • テキストノード-ここに行くかもしれません。
  • ノード<p>-段落もあります
  • テキストノード-段落なしでより多くのテキストを送信できます
  • ノード<br>-<空>
4

4 に答える 4

12

Element.children()は、 Elementsオブジェクト( Elementオブジェクトのリスト)を返します。親クラスであるNodeを見ると、 Node.childNodes()などのElementsだけでなく、任意のノードにアクセスできるようにするメソッドがあります。

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();
    int i = 0;

    for (Node node : div.childNodes()) {
        i++;
        System.out.println(String.format("%d %s %s",
                i,
                node.getClass().getSimpleName(),
                node.toString()));
    }
}

結果:

1 TextNode
 いくつかのテキスト
2要素<b>タグ付き</b>
3TextNodeはここに移動する可能性があります。
4要素<p>段落もあります</p>
5TextNode段落なしでより多くのテキストを入力できます
6要素<br/>
于 2012-04-16T20:45:27.320 に答える
4
for (Element el : doc.select("body").select("*")) {

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

                    node.text() ));

        }

    }
于 2013-08-13T21:10:25.140 に答える
1

テキストのみ(タグなし)が必要な場合、私の解決策は以下のとおりです。
出力は次のとおり
です。タグ付きの一部のテキストがここに表示される場合があります。また、段落があります。より多くのテキストが段落なしで進むことができます

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());
        }
    }
}
于 2014-12-16T20:21:27.853 に答える
1

この目的でTextNodeを使用できます。

List<TextNode> bodyTextNode = doc.getElementById("content").textNodes();
    String html = "";
    for(TextNode txNode:bodyTextNode){
        html+=txNode.text();
    }
于 2015-07-21T18:41:40.773 に答える