【问题标题】:Jsoup keep only clean <p> tags and delete everything elseJsoup 只保留干净的 <p> 标签并删除其他所有内容
【发布时间】:2018-03-25 04:16:04
【问题描述】:

这似乎是一个简单的解决方案,但我终生无法解决。

我有一个由&lt;p&gt; 和p class="example"> 以及一些&lt;p&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/p&gt; 混合组成的元素集合。

我要做的就是保留所有内容(包括标签和它的字符串),这是一个干净的&lt;p&gt; 标签。

我目前正在使用的大部分都是我想要的,但我似乎真的无法摆脱&lt;p&gt;&lt;strong&gt;...&lt;/strong&gt;&lt;/p&gt;

@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();
}

基本上我想删除整个&lt;p&gt;&lt;/p&gt; 标记,如果它的属性和正文中包含除文本以外的任何内容。

有什么简单的方法吗?

干杯

编辑#1 我所拥有的以及我想要回来的 HTML 示例。对困惑感到抱歉!

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

我只想要干净的&lt;p&gt; 标签及其内容,其余元素可以删除。

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

【问题讨论】:

  • 请贴出你需要解析的html代码

标签: java html jsoup


【解决方案1】:

如果您想删除其中包含元素的&lt;p&gt; 标签,您只需使用以下代码检查它们是否有任何子标签:

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();
    }
}

我不确定我是否了解您对删除带有属性的标签的要求,但这应该注意删除其中带有元素的标签。

【讨论】:

    【解决方案2】:

    问题不在于我如何解析 HTML,而在于我对从 Element 对象调用时 jsoup 如何处理 remove 缺乏了解。它并没有像我期望的那样从集合中删除它,但是它确实从Document 中删除了它。

    从我在问题中的代码中可以看出,我使用删除操作的结果来构建一个字符串,该字符串当然会包含我不想要的元素,即使它们已从 @ 中删除987654326@。

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

    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();
    }
    

    我发现非常有用的信息是this SO post,其中解释了删除操作。

    如果有人有我的问题的更好解决方案,我仍然很乐意听到!

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2012-10-08
      • 1970-01-01
      • 2013-05-09
      • 2011-06-08
      相关资源
      最近更新 更多