You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSOUP技术问题:无法从Elements集合中移除父元素td

解决Jsoup遍历移除空td元素的问题

我懂你现在的困扰——你已经清理掉了td里的<strong>、<b>这些子元素,但那些空的父td还留在results集合里,想用forEach循环删掉它们却踩坑了对吧?这其实是遍历集合时直接修改集合结构导致的常见问题,Jsoup的Elements本质上是个Java集合,forEach遍历的时候直接调用remove()会触发ConcurrentModificationException。

给你两个靠谱的解决方案:

方法一:反向遍历删除

从集合的最后一个元素往前遍历,这样删除元素不会影响前面未遍历的元素索引:

// 先保留你原来的清理代码
Elements results = docu.select("tr");
results.select("td > strong").remove();
results.select("td > b").remove();
results.select("td > p > strong").remove();
results.select("td.showingInfo").remove();

// 反向遍历移除空td
for (int i = results.size() - 1; i >= 0; i--) {
    Element td = results.get(i);
    // 检查td是否真的为空:没有子元素,且文本内容去掉空白后为空
    if (td.children().isEmpty() && td.text().trim().isEmpty()) {
        td.remove();
    }
}

方法二:使用迭代器安全删除

这是Java集合中遍历删除的标准安全方式,用迭代器的remove()方法来同步集合状态:

Elements results = docu.select("tr");
// 原清理代码不变
results.select("td > strong").remove();
results.select("td > b").remove();
results.select("td > p > strong").remove();
results.select("td.showingInfo").remove();

// 迭代器遍历删除空td
Iterator<Element> iterator = results.iterator();
while (iterator.hasNext()) {
    Element td = iterator.next();
    if (td.children().isEmpty() && td.text().trim().isEmpty()) {
        iterator.remove(); // 用迭代器的remove方法,不会触发并发修改异常
    }
}

额外提示

判断td是否需要删除时,记得同时检查子元素是否为空和文本内容是否仅含空白字符——有时候td里可能只剩换行、空格这些看不见的字符,这时候也应该把它删掉。

内容的提问来源于stack exchange,提问作者Jevon Cowell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:56:08