【发布时间】:2016-06-05 19:15:45
【问题描述】:
我正在编写一个清理网页的脚本。这包括遍历所有标签(元素)并检查某些规则:
for (Element element : document.select("*") ) {
if (element == null) {
continue;
}
if ( RULE1) ) {
element.remove();
}
else if( RULE2){
element.remove();
}
else if ( RULE3 ) {
element.remove();
}
else if ( RULE4 ) {
element.remove();
}
}
我已经在几十页上对此进行了测试,没有任何问题。今天我刚打了一个网页抛出java.lang.IndexOutOfBoundsException:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.remove(ArrayList.java:492)
at org.jsoup.nodes.Node.removeChild(Node.java:423)
at org.jsoup.nodes.Node.remove(Node.java:266)
我的猜测是,在某些时候,代码会尝试删除已删除的元素。但不知道如何/为什么会发生这种情况。
有什么想法吗?
谢谢。
编辑 1:导致中断的规则
我发现了导致代码失败的规则。其中一条规则实际上并未删除element,而是重置其文本:
else if ( matches junk text ) {
String match = getMatchingJunk ( element.ownText() );
if ( match.length() < JUNK_TEXT_ELEMENT_REMOVAL_THRESH ) {
element.text( removeSmallest(element.ownText(), match) ); // <= causing error
continue;
}
element.remove();
}
如果我删除element.text( removeSmallest(element.ownText(), match) ) 行,错误就会消失。
【问题讨论】:
标签: java arrays html-parsing jsoup