如何使用Jsoup只获得n级元素?

时间:2018-04-18 20:07:29

标签: java html jsoup

我有一个包含多个图层的巨大内容表:

enter image description here

我需要对其进行编辑并仅保留Level1Level2的元素并删除其他所有内容,如下所示:

enter image description here

因此我使用Jsoup:

File in = new File(INPUT_FILE_PATH);
Document origDoc = Jsoup.parse(in, null);
Elements toc = origDoc.getElementsByClass("toc");
Elements firstLevelChildElements = toc.select("ul");

然后我想分析元素,如果元素只有一个父元素 - 保留它,否则将其删除。

但问题是firstLevelChildElements选择了第一个ul及其所有子项。当我尝试选择nexts子元素时也会发生同样的情况。我不能只拥有所有元素的列表(或树)。

示例HTML代码是:

<ul class="toc">
    <li>
        <a href="#toc_20">Level 1</a>
        <ul>
            <li>
                <a href="#toc_21">Level 2</a>
                <ul>
                    <li>
                        <a href="#toc_22">Level 3</a>
                    </li>
                </ul>
            </li>
            <li>
                <a href="#toc_28">Level 2</a>
            </li>
            <li>
                <a href="#toc_29">Level 2</a>
            </li>
        </ul>
    </li>
    <li>
        <a href="#toc_20">Level 1</a>
        <ul>
            <li>
                <a href="#toc_21">Level 2</a>
                <ul>
                    <li>
                        <a href="#toc_22">Level 3</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

This answer很不错,但遗憾的是对我不起作用。

1 个答案:

答案 0 :(得分:1)

使用Jsoup你可以操纵dom。选择您不想要的所有元素并清空它们的html。您可以使用css选择器执行此操作:

    Document doc = Jsoup.parse(html);
    for (Element e : doc.select("ul > li > ul > li > ul")) {
        e.html("");
    }

或更多用于选择所有具有toc类的ul元素的四阶子元素:

    Document doc = Jsoup.parse(html);
    for (Element e : doc.select("ul.toc > * > * > * > * > *")) {
        e.html("");
    }

然后从修改过的文档中选择所需的元素。

有关css选择器的更多信息:

https://www.w3schools.com/cssref/css_selectors.asp

https://jsoup.org/cookbook/extracting-data/selector-syntax