如何更新元素以使其不包含已删除的链接?

时间:2016-07-20 20:11:10

标签: java jsoup

  

注意:有一个类似的问题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
      }
    }
}

2 个答案:

答案 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对象中的元素。