11

我想这个问题已经被问到了,但我什么也没找到。

DocumentJsoup 中的元素,如何遍历 HTML 内容中的所有元素?

我正在阅读文档,并且正在考虑使用该childNodes()方法,但它仅从以下一级获取节点(据我所知)。我想我可以使用这种方法进行一些递归,但我想知道是否有更合适/原生的方法来做到这一点。

4

3 回答 3

26

Document(和任何子Node类),您可以使用该traverse(NodeVisitor)方法。

例如:

document.traverse(new NodeVisitor() {
    public void head(Node node, int depth) {
        System.out.println("Entering tag: " + node.nodeName());
    }
    public void tail(Node node, int depth) {
        System.out.println("Exiting tag: " + node.nodeName());
    }
});
于 2012-04-11T18:09:35.290 回答
2

1) 您可以使用 * 选择器选择文档的所有元素。

Elements elements = document.body().select("*");

2) 使用 Element.ownText() 方法单独检索每个文本。

for (Element element : elements) {
  System.out.println(element.ownText());
}

3) 使用 Element.html(String strHtml) 单独修改每个文本。(清除元素中任何现有的内部 HTML,并将其替换为已解析的 HTML。)

element.html(strHtml);

希望这会帮助你。谢谢!

于 2016-06-12T15:43:19.987 回答
0

您可以使用以下代码:

public class JsoupDepthFirst {

    private static String htmlTags(Document doc) {
        StringBuilder sb = new StringBuilder();
        htmlTags(doc.children(), sb);
        return sb.toString();
    }

    private static void htmlTags(Elements elements, StringBuilder sb) {
        for(Element el:elements) {
            if(sb.length() > 0){
                sb.append(",");
            }
            sb.append(el.nodeName());
            htmlTags(el.children(), sb);
            sb.append(",").append(el.nodeName());
        }
    }

    public static void main(String... args){
        String s = "<html><head>this is head </head><body>this is body</body></html>";
        Document doc = Jsoup.parse(s);
        System.out.println(htmlTags(doc));
    }
}
于 2016-01-30T01:12:18.713 回答