当前位置: 首页 > 知识库问答 >
问题:

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

蒋硕
2023-03-14

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的所有textnodes,所以它会尝试删除正文,因为这是第一个包含textnodes的元素。

我只想选择所有带有文本的元素,并做element.parent().children().remove();

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

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

这个问题与这个问题有关但又不相同。

编辑:

输入:

<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个答案

闻人修明
2023-03-14

空p标记作为预期输出的一部分的特殊情况(即使它与“包含实际文本”的规则相矛盾)需要特殊的解析。对于更复杂的文档/在输出中允许更多的空文本级元素的解决方案,将需要额外的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>
 类似资料:
  • 问题内容: 我刚开始使用Selenium Webdriver,就立即遇到了一个问题,涉及要尝试选择/单击的所有按钮,这些按钮都没有ID并共享同一类。 所以我想知道如何通过它们包含的唯一文本来选择它们。 我可能正在考虑使用CSS选择器,但是我不确定如何告诉它寻找特定文本以选择元素。 我目前所拥有的是: 到目前为止非常基本。 我有CssSelector的地方,不确定是否要说选择包含文本“ xyz”的“

  • 问题内容: 我将通过jsoup连接到一个url并获取它的所有内容,但问题是,如果我选择喜欢, 它返回一个元素,但是我想获取页面中的所有元素,例如,一个一个地迭代它们, 如果我选择使用body,我会在一行中得到结果,例如, 相反,我想选择所有元素并逐个迭代并产生如下结果: 使用jsoup可以吗? 谢谢, 卡尔提克 问题答案: 您可以使用选择器选择文档的所有元素,然后使用分别获取每个元素的文本。

  • 我正在做一个项目,我只对页面布局感兴趣,对文本不感兴趣。我现在很难摆脱文本级别的每一个元素。例如: 我想在文本级别上去掉ul,li,p和h3元素,但保留div和带有菜单项的列表,因为这是页面布局的一部分。如何使用JSOUP实现这一点? 我一直试图通过document.select()和.remove()这些元素来实现这一点,但是select函数并不是为这种非标准查询而设置的。 编辑:我想得到的最终

  • 本文向大家介绍Jsoup 使用CSS选择器选择元素,包括了Jsoup 使用CSS选择器选择元素的使用技巧和注意事项,需要的朋友参考一下 示例 您可以在此处找到支持的选择器的详细概述。

  • 问题内容: 我想使用JSoup从文档中选择所有注释。我想做这样的事情: 我已经试过了: } 但是在日食“不兼容的条件操作数类型元素和注释”中发生以下错误。 干杯, 问题答案: 由于您需要应用到节点对象,而不是元素,因此:

  • 所以,假设我在这里有这个HTML块:(这是Java JSOUP(顺便说一下)) 现在我有一个元素列表(作为elements类型),我想选择这些元素,但只选择那些在img标记的alt=“”部分中具有“vegetarian”属性的元素。 现在我可以根据是否是素食主义者来选择,例如 meals.select(“img[alt=fegetarian]”) 但这只将实际的img标记作为元素返回,从而丢失了对