如何使用Jsoup删除文本级别的所有元素?

时间:2016-08-17 12:49:00

标签: java html jsoup

我正在处理一个项目,我只对页面布局感兴趣,而不是对文本感兴趣。我目前无法摆脱文本级别的每个元素。例如:

<div>
    <ul>
        <li>some menu item</li>
        <li>some menu item</li>
        <li>some menu item</li>
    </ul>
</div>
<div>
    <h3>Tile of some text</h3>
    <p></p>
    <p>some text</p>
    <ul>
        <li>some other text</li>
        <li>some other text</li>
        <li>some other text</li>
    </ul>
</div>

我想在文本级别上删除 ul,li,p和h3 元素,但是将div和列表保留为菜单项,因为这是页面布局的一部分。我如何用Jsoup做到这一点?

我一直在尝试使用document.select()然后.remove()执行此操作,但是不会对此类非标准查询执行select函数。

编辑:我想得到的最终结果是:

<div>
    <ul>
        <li>some menu item</li>
        <li>some menu item</li>
        <li>some menu item</li>
    </ul>
</div>
<div>

</div>

正如您所看到的,当ul标签与包含文本的标签位于同一级别时,它会删除列表。 ul标记是页面上文本的一部分,与页面布局无关。带有菜单项的ul标签对于页面很重要,因为它定义了一个菜单,它有3个不同的项目。

2 个答案:

答案 0 :(得分:2)

您可以使用标准选择并删除所有pliul元素:

for (Element element : doc.select("p")) {
   element.remove();
}

答案 1 :(得分:0)

我首先找到了我想要删除的标签,然后在其父级上调用了empty()。

    public static void main(String[] args) {
        String html = "<div> <ul>  <li>some menu item</li>  <li>some menu item</li>  <li>some menu item</li> </ul></div><div> <h3>Tile of some text</h3> <p></p> <p>some text</p> <ul>  <li>some other text</li>  <li>some other text</li>  <li>some other text</li> </ul></div>";
        Document doc = Jsoup.parse(html.toString());
        Elements elements = doc.body().select("*");
        for (Element element : elements) {
            if ("h3".equals(element.tagName()) || "p".equals(element.tagName())) {
                element.parent().empty();
            }
        }
        System.out.println(doc.toString());
    }