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

时间:2013-04-03 19:02:04

标签: java jsoup

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

输入:

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

基本上,我必须删除第一次出现<div class="XYZ">

的整个块

谢谢,

4 个答案:

答案 0 :(得分:15)

您最好迭代找到的所有元素。所以你可以保持

  • a。)删除所有元素
  • b。)如果没有元素,那就没事了。

示例:

Document doc = ...

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

修改

(我的评论的补充)

在此处进行简单的 null- /范围检查时,不要使用异常处理:

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.
     */
}

答案 1 :(得分:1)

试试这段代码:

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

我已经从文件中读取了输入XML,并通过逐行读取将其存储在StringBuilder对象中,然后替换整个 标记将为空字符串。

答案 2 :(得分:0)

昨天我问了这个问题,感谢ollo的回答。它解决了。 有上述问题的延伸。我不知道我是否必须开始一个新的帖子或链接这个。所以,在这种混乱中,我在这里链接它。管理员请原谅我,如果我不得不为此单独发帖。

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

真实情况是: 它应该删除带有匹配组件的标记块+删除它周围的<br />

参考上面的例子。

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

也应该提供相同的输出:

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

因为html标记块上方和下方有<br />要移除....

只是为了重新迭代,我使用ollo给出的解决方案来匹配并删除标记块。

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

谢谢, 谢卡尔

答案 3 :(得分:0)

这可能会对你有帮助。

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