【问题标题】:How can I get all website links recursively?如何递归获取所有网站链接?
【发布时间】:2014-08-26 16:50:06
【问题描述】:

我需要编写一个代码以递归方式获取网站中的所有链接。由于我是新手,这就是我目前所拥有的;

List<WebElement> no = driver.findElements(By.tagName("a"));
nooflinks = no.size();
for (WebElement pagelink : no)
{
    String linktext = pagelink.getText();
    link = pagelink.getAttribute("href"); 
}

现在我需要做的是,如果列表找到同一域的链接,那么它应该从该 URL 获取所有链接,然后返回到上一个循环并从下一个链接继续。这应该一直持续到找到整个网站中的最后一个 URL。例如,主页是基本 URL,它有 5 个其他页面的 URL,然后在获取 5 个 URL 中的第一个后,循环应该让第一个 URL 的所有链接返回主页并从第二个 URL 恢复。现在,如果第二个 URL 有子子 URL,那么循环应该找到第一个链接的链接,然后恢复到第二个 URL,然后返回主页并从第三个 URL 恢复。

谁能帮帮我???

【问题讨论】:

  • stackoverflow.com/questions/5913613/… 有一些关于处理 URL 的信息,如果您试图确定一个链接是否在同一个域中,这可能会有所帮助。没有保证,我还没有进一步调查

标签: java list recursion


【解决方案1】:

我最近看到了这篇文章。我不知道您是否仍在为这个问题寻找任何解决方案。如果没有,我认为它可能有用:

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.Iterator;
public class URLReading {
public static void main(String[] args) {
 try {
    String url="";
    HashMap<String, String> h = new HashMap<>(); 
    Url = "https://abidsukumaran.wordpress.com/";
    Document doc = Jsoup.connect(url).get();
  
    //  Page Title
    String title = doc.title();
   //System.out.println("title: " + title);
 
  //  Links in page
  Elements links = doc.select("a[href]");
  List url_array = new ArrayList();
  int i=0;
  url_array.add(url);
  String root = url;
  h.put(url, title);
  Iterator<String> keySetIterator = h.keySet().iterator();
  while((i<=h.size())){
      try{
          url = url_array.get(i).toString();
      doc = Jsoup.connect(url).get();
      title = doc.title();
      links = doc.select("a[href]");
      
    for (Element link : links) {
         
   String res= h.putIfAbsent(link.attr("href"), link.text());
   if (res==null){
   url_array.add(link.attr("href"));
   System.out.println("\nURL: " + link.attr("href"));
   System.out.println("CONTENT: " + link.text());
   }
  } 
 }catch(Exception e){
        System.out.println("\n"+e);
      }
 
      i++;
 
     }
     } catch (Exception e) {
     e.printStackTrace();
     }
    }
   }

【讨论】:

    【解决方案2】:

    您可以使用SetHashSet。你可以这样尝试:

    Set<String> getLinksFromSite(int Level, Set<String> Links) {
        if (Level < 5) {
            Set<String> locallinks =  new HashSet<String>();
            for (String link : Links) {
                Set<String> new_links = ;
                locallinks.addAll(getLinksFromSite(Level+1, new_links));
            }
            return locallinks;
        } else {
            return Links;
        }
    
    }
    

    【讨论】:

    • 您好 R.T.,我是否将此代码与现有的 for 循环一起放在我的代码中?还是我应该用这个完全替换我的代码?
    【解决方案3】:

    我认为以下成语在这种情况下会很有用:

    Set<String> visited = new HashSet<>();
    Deque<String> unvisited = new LinkedList<>();
    
    unvisited.add(startingURL);
    while (!unvisited.isEmpty()) {
        String current = unvisited.poll();
        visited.add(current);
        for /* each link in current */ {
            if (!visited.contains(link.url())
                unvisited.add(link.url());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      相关资源
      最近更新 更多