[英]How can I get all website links recursively?
我需要編寫一個代碼來遞歸地獲取網站中的所有鏈接。 由於我是新手,這是我迄今為止所擁有的;
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 恢復。
有人可以幫我嗎???
我最近看到了這個帖子。 我不知道你是否還在尋找這個問題的任何解決方案。 如果沒有,我認為它可能有用:
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();
}
}
}
您可以使用Set
和HashSet
。 你可以這樣嘗試:
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;
}
}
我認為以下習語在這種情況下會很有用:
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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.