【问题标题】:Deleting parent tags without deleting children with Jsoup使用 Jsoup 删除父标签而不删除子标签
【发布时间】:2020-07-23 01:25:45
【问题描述】:

要重新制作的示例代码:

       <div class="mrd3w m6et0 _2d49e_1O4vF"> 
        <div class="p1td4 pw4go p513t al2kje m10qy mij5n"> 
         <div class="_2d49e_2tor6" style="max-width:871px;max-height:552px"> 
          <div class="ptv8j2" style="padding-top:calc(100% * 552 / 871)">
           <img alt="alt" class="_2d49e_3B1Cq pt94f9 pt1itw ptux49 w1eai _2d49e_32cUf lazyloaded" sizes="(min-width: 1200px) 560px, (min-width: 992px) 50vw, 100vw" src="https://somelink.com 871w" width="871px">
          </div> 
         </div> 
        </div> 
       </div> 

我已经从这个 html 中删除了一些无用的链接和导入,这是我的最后一个问题。 div 的类别是随机的,而且数量很多。

我需要像这样简单干净的代码:

<div>
  <img alt="alt" src="https://somelink.com">
</div>

我正在从数据库创建 xml 文件,每个产品的描述都是一团糟,需要尽可能干净。整个描述在数据库中作为具有所有这些混乱端口和标签的值。我正在使用 Jsoup 重新制作此描述,但不知道如何在不删除子项的情况下删除父项。

【问题讨论】:

    标签: java html jsoup


    【解决方案1】:

    这需要两个步骤:

    1. 要清除不需要的标签和属性,请使用Whitelist 和Jsoup.clean(html, whitelist)
    2. 要删除父级,您可以使用element.unwrap()。要删除重复的父母,我们可以使用循环向上移动,如果它们相同,则将其删除。

    这是执行此操作的代码:

    public class JsoupIssue61137870 {
    
        public static void main(final String[] args) throws IOException {
            String html = "  <div class=\"mrd3w m6et0 _2d49e_1O4vF\"> \n"
                    + "        <div class=\"p1td4 pw4go p513t al2kje m10qy mij5n\"> \n"
                    + "         <div class=\"_2d49e_2tor6\" style=\"max-width:871px;max-height:552px\"> \n"
                    + "          <div class=\"ptv8j2\" style=\"padding-top:calc(100% * 552 / 871)\">\n"
                    + "           <img alt=\"alt\" class=\"_2d49e_3B1Cq pt94f9 pt1itw ptux49 w1eai _2d49e_32cUf lazyloaded\" sizes=\"(min-width: 1200px) 560px, (min-width: 992px) 50vw, 100vw\" src=\"https://somelink.com 871w\" width=\"871px\">\n"
                    + "          </div> \n" + "         </div> \n" + "        </div> \n" + "       </div> ";
    
            Whitelist whitelist = Whitelist.none();
            whitelist.addTags("div", "img");
            whitelist.addAttributes("img", "src");
            String cleanHTML = Jsoup.clean(html, whitelist);
            System.out.println(cleanHTML);
    
            String result = removeRepeatingTags(cleanHTML);
            System.out.println(result);
        }
    
        private static String removeRepeatingTags(String html) {
            Document doc = Jsoup.parse(html);
            Element img = doc.selectFirst("img");
            Element parent = img.parent();
            while (parent.tagName().equals(parent.parent().tagName())) {
                parent.unwrap();
                parent = img.parent();
            }
            return doc.toString();
        }
    }
    

    第一部分的输出是:

    <div> 
     <div> 
      <div> 
       <div> 
        <img alt="alt" src="https://somelink.com 871w"> 
       </div> 
      </div> 
     </div> 
    </div>
    

    第二部分之后的输出是:

    <html>
     <head></head>
     <body>
      <div>    
        <img alt="alt" src="https://somelink.com 871w">  
      </div>
     </body>
    </html>
    

    Jsoup 会添加 &lt;html&gt; &lt;head&gt; 和 &lt;body&gt; 标签。为了避免这种情况而不是

        Document doc = Jsoup.parse(html);
    

    使用

        Document doc = Jsoup.parse(html, "", Parser.xmlParser());
    

    输出将完全符合您的预期:

    <div>    
     <img alt="alt" src="https://somelink.com 871w">    
    </div>
    

    【讨论】:

    • 非常感谢。一段时间后,我得到回应说我的 xml 中不欢迎这些 img 标签,所以我只使用了白名单和清理方法。上面的解决方案非常好,将来会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2012-04-08
    • 2016-04-16
    • 2020-10-27
    • 2014-09-03
    • 2012-01-20
    相关资源
    最近更新 更多