Jsoup - 提取文本(Jsoup - extracting text)

2019-06-23 16:41发布

我需要从这样的节点中提取文本:

<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忽略文本节点。

是否有办法来迭代元素的内容接收文本节点为好。 例如

  • 文本节点 - 一些文本
  • 节点的<b> - 与标签
  • 文本节点 - 可能会去这里。
  • 节点<P> - 还有一些段落
  • 文本节点 - 更多的文字可以去无段落
  • 节点搜索 - <空>

Answer 1:

Element.children()返回一个元素对象-列表元素的对象。 纵观父类, 节点 ,你会看到的方法来给你随心所欲的节点,而不仅仅是元素,如访问Node.childNodes() 。

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 
 Some text 
2 Element <b>with tags</b>
3 TextNode  might go here. 
4 Element <p>Also there are paragraphs</p>
5 TextNode  More text can go without paragraphs
6 Element <br/>


Answer 2:

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

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

                    node.text() ));

        }

    }


Answer 3:

假设你想纯文本(无标签)我的解决方案如下。
输出是:
与标签的某些文本可能会去这里。 还有一些段落。 更多的文字可以去无段落

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


Answer 4:

您可以使用TextNode用于此目的:

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


文章来源: Jsoup - extracting text