如何使用jsoup获取href

时间:2014-11-16 02:05:46

标签: java recursion jsoup

我有一些网址。我希望从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;
            }
        }
    }
}

如何修复递归条件以使其正确?

2 个答案:

答案 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)获取具有指定属性的所有元素