注意:有一个类似的问题HERE。但是,我已经回顾了这个问题并没有解决我的问题。请提前阅读。
我写了一个尝试从Elements
删除某些链接的方法。我了解remove()
会从Element
ob中删除Document
。但是,如何更新我的Elements
以便它不包含已删除的链接?
以下是我的方法。
public void getLinks(Document site) {
Elements links = site.select("a[href]");
for(int i = 0 ; i < links.size() ; i++) {
String url = links.get(i).attr("abs:href");
if(url.endsWith("~S1")) {
System.out.println(url);
} else {
links.remove(i); // links still contains removed Element
}
}
}
答案 0 :(得分:1)
我建议您使用listIterator
。
您可以在迭代列表时安全地删除元素(Elements extends ArrayList class)
ListIterator<Element> it = links.listIterator();
while(it.hasNext()){
Element link = it.next();
String url = links.get(i).attr("abs:href");
if(... {// your condition. I can't properly copy, writing from a mobile phone
link.remove();
}
}
请记住,在通过公共for
运算符进行迭代时从列表中删除元素是不安全的。因为重新索引。例如。你已经删除了第5个元素,循环计数器加1,你想要删除第6个元素,而是删除第7个元素。 List接口不保留空索引,因此它将在删除操作后立即重新组织元素列表,以支持不可破坏的序列。
用于您的任务ListIterator
权限,它是为删除,双向迭代等目的而创建的。
答案 1 :(得分:1)
如何更新我的元素,使其不包含已删除的链接?
Elements
实际上提供了一些不需要在子元素上迭代或循环的便捷方法。
启动html:
<html>
<head></head>
<body>
<div>
<a href="foo.html?S1">foo</a>
<a href="not_foo.html">not foo</a>
<a href="foo2.html?S1">foo2</a>
</div>
</body>
</html>
获取示例Elements
obj:
Elements elements = doc.select("a");
System.out.println(elements.outerHTML());
...
<a href="foo.html?S1">foo</a>
<a href="not_foo.html">not foo</a>
<a href="foo2.html?S1">foo2</a>
删除以&#34; S1&#34;结尾的链接来自Elements
对象:
elements.removeAll(elements.select("a[href$=S1]"));
System.out.println(elements.outerHTML());
...
<a href="not_foo.html">not foo</a>
或者,创建一个新的Elements
obj,其中不包含以&#34; S1&#34;结尾的链接:
Elements cleanLinks = elements.not("a[href$=S1]");
System.out.println(cleanLinks.outerHtml());
...
<a href="not_foo.html">not foo</a>
注意:Elements.remove(Collection)
和Elements.not(String)
都不会删除Document
对象中的元素。