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
相关产品推荐
相关产品推荐

