如何使用Jsoup选择包含实际文本的所有元素?

时间:2016-08-22 13:34:55

标签: java html jsoup

Jsoup将每个文本保存为textnode,包括元素之间的\ r \ n内容。我想选择页面上的所有真实文本并选择其父文件以删除该父文件中的每个文本。

我目前有这个:

document.select("*:containsOwn(\n)").remove();
    for(int i = 1; i < document.size(); i++){
        if(document.get(i).hasText()){
            List<Element> removableElements = document.get(i).parent().getAllElements();
            for (Element e1 : removableElements) {
                e1.remove();
            }
        }

    }

它不会删除所有包含\ n的文本节点,因此它会尝试删除正文,因为这是第一个包含文本节点的元素。

我只想选择带有文字的所有元素 。 element.parent()的儿童()除去();

document.select("*:contains( )"); 

也没有按我想要的方式工作。

此问题与this问题有关,但不一样。

修改

输入:

<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>

输出:

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

1 个答案:

答案 0 :(得分:1)

作为预期输出的一部分的空p标签的特殊情况(即使它与“包含实际文本”的规则相矛盾)需要特殊的解析。对于更复杂的文档/在输出中允许更多空text-level elements的解决方案,需要额外的if语句来处理这些元素(首先比较if语句):

String htmlString = "<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(htmlString);

for (Element element : doc.getAllElements()) {
    if(element.nodeName().equals("p") && element.childNodes().size()==0){
        System.out.println(element.toString());
    }
    else if(element.childNodes().size()>0 && element.childNode(0).nodeName().equals("#text")){
        System.out.println(element.toString());
    }
}

输出:

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