Java 使用jsoup解析html并删除标记块

Java 使用jsoup解析html并删除标记块,java,jsoup,Java,Jsoup,我想删除标签之间的所有内容。示例输入可以是 输入: <body> start <div> delete from below <div class="XYZ"> first div having this class <div> waste </div> <div class="XYZ"> second div havin

我想删除标签之间的所有内容。示例输入可以是

输入:

<body>
  start
  <div>
    delete from below
    <div class="XYZ">
      first div having this class
      <div>
        waste
      </div>
      <div class="XYZ">
        second div having this class
      </div>
      waste
    </div>
    delete till above
  </div>
  <div>
    this will also remain
  </div>
  end
</body>

开始
从下面删除
有这门课的第一组
浪费
二等兵
浪费
删除至上文
这也将继续存在
结束
输出将是:

<body>
  start
  <div>
    delete from below
    delete till above
  </div>
  <div>
    this will also remain
  </div>
  end
</body>

开始
从下面删除
删除至上文
这也将继续存在
结束
基本上,对于第一次出现的

谢谢,

请尝试以下代码:

String data = null;
    BufferedReader br = new BufferedReader(new FileReader("e://XMLFile.xml"));
    StringBuilder builder = new StringBuilder();
    while ((data = br.readLine()) != null) {
        builder.append(data);
    }
    System.out.println(builder);
    String replaceAll = builder.toString().replaceAll("<div class=\"XYZ\".+?</div>", "");
    System.out.println(replaceAll);
字符串数据=null;
BufferedReader br=新的BufferedReader(新的文件阅读器(“e://XMLFile.xml”);
StringBuilder=新的StringBuilder();
而((data=br.readLine())!=null){
附加(数据);
}
System.out.println(生成器);
String replaceAll=builder.toString().replaceAll(“您最好迭代找到的所有元素。这样您就可以

  • a、 )所有元件均已移除,并且
  • b、 )如果没有元素,就什么也做不了
示例:

Document doc = ...

for( Element element : doc.select("div.XYZ") )
{
    element.remove();
}

编辑:

Document doc = ...

for( Element element : doc.select("div.XYZ") )
{
    element.remove();
}
(补充我的评论)

在这里,当简单的空/范围检查足够时,不要使用异常处理:

doc.select("div.XYZ").first().remove();
相反:

Elements divs = doc.select("div.XYZ");

if( !divs.isEmpty() )
{
    /*
     * Here it's safe to call 'first()' since there at least one element.
     */
}

昨天我问了这个问题,多亏了奥利的回答,问题解决了。 上面的问题有一个扩展。我不知道我是否必须开始一个新的帖子或链接这个帖子。所以,在这种混乱中,我将它链接在这里。管理员们,请原谅,如果我必须为这个单独的帖子

在上面的问题中,我必须删除带有匹配组件的标记块

实际情况是: 它应该移除带有匹配组件的标记块,并移除其周围的

参考上面的例子

<body>
  start
  <div>
    delete from below
    <br />
    <br />
    <div class="XYZ">
      first div having this class
      <div>
        waste
      </div>
      <div class="XYZ">
        second div having this class
      </div>
      waste
    </div>
    <br />
    delete till above
  </div>
  <div>
    this will also remain
  </div>
  end
</body>
谢谢, 谢哈尔这可能对你有帮助

 String selectTags="div,li,p,ul,ol,span,table,tr,td,address,em";
 /*selecting some specific tags */
 Elements webContentElements = parsedDoc.select(selectTags); 
 String removeTags = "img,a,form"; 
 /*Removing some tags from selected elements*/
 webContentElements.select(removeTags).remove();

到目前为止,您做了什么?我在Jsoup选择器中找到了答案。解决方案类似于:Document doc=Jsoup.parse(html);doc.select(“div.XYZ”).first().remove();return doc.body().outerHtml();但这里有一个问题,当我运行此程序时,它为包含
的html字符串提供了正确答案,但如果输入html字符串中不存在
,它将返回
java.lang.NullPointerException
。我是否需要检查所有内容并仅在找到该类型的div时执行该步骤?谢谢。我无法回答我的问题n问题???AWWWWN不可以。但你可以将你的解决方案作为答案发布,然后接受它(请参阅:)。如果你的问题得到解决,请这样做。你可以轻松地使用Jsoup。一般来说,最好不要使用正则表达式,而是使用html库(如Jsoup)@奥利奥:谢谢你提供的信息。我不知道Jsoup。@Ankur.谢谢,但我在评论中给出了使用Jsoup的解决方案。Document doc=Jsoup.parse(html);doc.select(“div.XYZ”).first().remove();return doc.body().outerHtml();谢谢奥利奥…我用doc.select(“div.XYZ”).first.remove()完成了它;并将其保存在try块中,如果捕获到异常(这意味着缺少必需字段),它将返回原始字符串。这样就解决了问题。但您的方法更好。不要对此使用异常处理-简单的空检查更好。再次感谢@ollo…您的解决方案为我提供了另一个问题的解决方案。我必须检查html标记的特定owntext并将其删除。我不知道至少,您可以在对每个循环进行迭代时删除元素,这很方便。谢谢……请参阅我的编辑。顺便说一句。您是对的;使用循环更好,因为如果没有元素(
first()
则抛出
NullPointerException
)。得到了解决方案,您可以使用[][]和属性条件。虽然ORI使用逗号,但这与公认的答案之间有什么区别吗?提到的角落案例OP似乎也包括在内。
 String selectTags="div,li,p,ul,ol,span,table,tr,td,address,em";
 /*selecting some specific tags */
 Elements webContentElements = parsedDoc.select(selectTags); 
 String removeTags = "img,a,form"; 
 /*Removing some tags from selected elements*/
 webContentElements.select(removeTags).remove();