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

Jsoup只保留干净的< p >标记,删除所有其他的

董俊晖
2023-03-14

这似乎是一个简单的解决方案,但我一辈子都无法解决。

我有一个由< code >混合组成的元素集合

我想做的就是保留所有东西(包括标签和它的字符串),这是一个干净的

我现在使用的大部分都是我想要的,但我似乎真的无法摆脱

@Override
public String fetchContent(String url) throws IOException {
    Document document = Jsoup.connect(url).get();

    Element body = document.select("article.story_landing").first();
    Elements elements = body.select("p:not([class])").select("p:not([id])");

    StringBuilder stringBuilder = new StringBuilder();

    for (Node child : elements) {
        if (child.attributes().size() <= 1) {
            stringBuilder.append(child.toString());
        }
    }

    return stringBuilder.toString();
}

基本上,我想删除整个<代码>

有什么简单的方法吗?

干杯

编辑#1一个超文本标记语言的例子,说明我有什么,以及我想要回什么。抱歉混淆了!

<div class="item-body">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p><strong>LOREM IPSUM:<br> *&nbsp;
        <a href="https://example.com"
           title="">Some random link</a><br> *&nbsp;
        <a href="https://example.com"
           title="">Some random link</a><br> *&nbsp;
        <a href="https://example.com"
           title="">Some random link</a><br> *&nbsp;
        <a href="https://example.com"
           title="">Some random link</a><br> *&nbsp;
    </strong>
    </p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p><a class="some_class" href="http://example.com">Some rando link</a></p>

    <p><a class="some_class" href="http://example.com">Some rando link</a></p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>
</div>

我只想要干净的<代码>

<div class="item-body">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac eleifend risus.</p>
</div>

共有2个答案

曾枫
2023-03-14

问题不在于我如何解析 HTML,问题在于我对从 Element 对象调用 jsoup 如何处理删除缺乏了解。它不会像我预期的那样将其从集合中删除,但它确实会将其从文档中删除。

正如您在问题中的代码中看到的那样,我正在使用删除操作的结果来构建一个字符串,该字符串当然会包含我不想要的元素,即使它们已从文档中删除。

最终的工作解决方案(仍然很乱)看起来像

public String fetchContent(String url) throws IOException {
    StringBuilder stringBuilder = new StringBuilder();
    Document document = Jsoup.connect(url).get();

    Element body = document.select("article.story_landing").first();
    Elements elements = body.getElementsByTag("p");

    for (int i = 0; i <= elements.size(); i++) {
        if (elements.get(i).children().size() != 0) {
            elements.remove(i);
        }
    }

    for (Node child : elements) {
        if (child.attributes().size() <= 1) {
            stringBuilder.append(child.toString());
        }
    }

    return stringBuilder.toString();
}

我发现非常有帮助的信息是这篇SO帖子,其中解释了移除操作。

如果有人有更好的问题解决方案,仍然喜欢听到更好的解决方案!

袁亦
2023-03-14

如果您想删除< code >

Elements allPTags = doc.getElementsByTag("p");

for(Element p : allPTags){
    // If size() isn't 0 it means that the p tag has children elements so 
    // remove it from the from the document.
    if(p.children().size() != 0){ 
        p.remove();
    }
}

我不确定我是否理解您对于移除带有属性的标签的要求,但是这应该可以移除带有元素的标签。

 类似资料:
  • 问题内容: 我正在尝试使用Jsoup删除HTML页面的标签之间的所有文本 例如,如果输入的HTML是 输出应为 基本上,我想删除由返回的内容 我发现有很多帖子是相反的,只保留文本,而没有什么可以解决我的问题。有关如何执行此操作的任何想法? 编辑 maverick9999提出的解决方案将解决大多数情况。 但是,正如注释中所注意到的,此解决方案还将删除嵌套标签。 举个例子: 将在输出中删除一个div:

  • 什么是正确的方法来删除只有HTML标签(保留所有自定义/未知的标签)与JSOUP(不是正则表达式)? 预期输入: 预期产出: 我尝试使用白名单清洁剂。none(),但它也会删除自定义标记。 我也尝试过: 但是它也删除了自定义标签。 这个答案对我不好,因为自定义标记的数量是无限的。

  • 我正在尝试使用 Jsoup 删除 HTML 页面标记之间的所有文本 例如,如果输入HTML是 输出应该是 基本上,我想删除返回的内容。 我找到了很多相反的帖子,只保留文本,但没有解决我的问题。知道怎么做吗? 编辑 maverick9999:https://stackoverflow.com/a/24292349/3589481提出的解决方案将解决大部分情况。 然而,正如评论中提到的,这个解决方案也

  • 假设我有一个像这样的html片段: 我想从中得到的是: 所以我的问题是:如何从html中去掉所有包装标签,只得到与html中相同顺序的文本?正如您在标题中看到的,我想使用jsoup进行解析。 重音html示例(请注意“á”字符): 我想要的是: 这个html不是静态的,一般来说,我只是想解码人类可读形式的通用html片段的每一个文本,宽度线中断。

  • 我必须解析一些html并移除锚标记,但我需要保留锚标记的innerHTML 例如,如果我的html文本是: 现在我可以解析上面的html并在jsoup中选择如下所示的标记, 我可以通过, 但是它会从开始括号到结束括号删除完整的achor标记,并且内部html会丢失,如何才能保留只删除开始和结束标记的内部html。 另外,请注意:我知道有从元素中获取outerHTML()和innerHTML()的方

  • 我想清除所有筛选规则,但保留筛选本身。 有没有直接快速的方法去做呢? 我找到的代码是: 它获取筛选器对象,我对筛选器#的选项数量是有限的。 注意:删除此筛选器,但我需要保留它。