[英]jsoup throwing IndexOutOfBoundsException on element.remove()
我正在寫一個清理網頁的腳本。 這包括遍歷所有標簽(元素)並根據某些規則進行檢查:
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) )
,錯誤就會消失。
如果我分兩個階段清除垃圾文本,該代碼似乎可以正常工作。 該代碼看起來有些重復和駭人聽聞。 也許有更好的方法可以做到這一點:
第一階段:收集所有垃圾
Map <String, Element> junks = new HashMap <String, Element>();
for (Element element : document.select("*") ) {
...
if () {
...
}
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
junks.put(elOwnText,element);
continue;
}
element.remove();
}
}
第二階段:清除垃圾
if ( size(junks) > 0 ) {
for(Map.Entry<String,Element> ent : junks.entrySet()){
String match = getMatchingJunk (ent.getKey()); // this looks repetitive. probably there's a better way to do it
if ( match.length() < JUNK_TEXT_ELEMENT_REMOVAL_THRESH ) {
ent.getValue().text( removeSmallest(ent.getKey(), match) ); // purge junk
}
} // end for
} // end if
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.