我有一些网址。我希望从html url中获取所有href,并且所有href都来自所有获取的href(递归)。关键是我想设置“递归”的深度 例如,如果depth = 1,我只需要来自HTML的href。如果depth = 2,我需要来自HTML的hrefs(假设list1)和来自list1的每个href的hrefs,依此类推
以下是我使用jsoup的内容:
import org.jsoup.*;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class Parser {
private final static String FILE_PATH = "src/main/resources/href.txt";
private List<String> result;
private int currentDepth;
private int maxDepth;
public Parser(int maxDepth) {
result = new ArrayList<String>();
this.maxDepth = maxDepth;
}
public void parseURL(String url) throws IOException {
url = url.toLowerCase();
if (!result.contains(url)) {
Connection connection = Jsoup.connect(url);
Document document = connection.get();
Elements links = document.select("a[href]");
for (Element link : links) {
String href = link.attr("href");
result.add(href);
parseURL(link.absUrl("href"));
currentDepth++;
if (currentDepth == maxDepth)
return;
}
}
}
}
如何修复递归条件以使其正确?
答案 0 :(得分:0)
我认为你应该在调用递归函数之前先检查深度。
if (currentDepth >= maxDepth){
// do nothing
}else{
parseURL(...)
}
答案 1 :(得分:0)
public void parseURL(String url) throws IOException {
url = url.toLowerCase();
if (!result.contains(url)) {
Connection connection = Jsoup.connect(url);
Document document = connection.get();
Elements links = document.getElementsByAttribute("href");
// Elements links = document.select("a[href]");
for (Element link : links) {
String href = link.attr("href");
result.add(href);
parseURL(link.absUrl("href"));
currentDepth++;
if (currentDepth == maxDepth)
return;
}
}
}
您可以在代码中尝试此操作,您可以从方法getElementsByAttribute(String attribute)
获取具有指定属性的所有元素