当前位置: 首页 > 知识库问答 >
问题:

如何使用 jsoup 获取 href

吕晟睿
2023-03-14

我有一些url。我想从url指向的html中获取所有href,从所有获取的hrefs中获取所有href(递归)。关键是我想设置“递归”的深度。例如,如果深度=1,我只需要来自超文本标记语言的href。如果深度=2,我需要来自超文本标记语言的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个答案

隆康平
2023-03-14
  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;
        }
    }
}

您可以在代码中尝试此操作,可以从方法获取具有指定属性的所有元素元素

袁泰
2023-03-14

我觉得在调用递归函数之前应该先检查深度。

if (currentDepth >= maxDepth){
    // do nothing
}else{
    parseURL(...)
}
 类似资料:
  • 我正在尝试从网站获取一些数据。它看起来像这样 我只需要得到div标签中的时间值。这是我的Java代码。 它没有给出任何错误,但在日志上 "D/NetworkSecurityConfig:未指定网络安全配置,使用平台默认设置" 我看到也许这可以帮助你解决问题。提前感谢您,任何回应将不胜感激。

  • 问题内容: 我有一个html: 我想按顺序获取所有文本,例如以下数组: 问题答案: 我将使用一种递归方法,该方法采用您的开始标记并对其子节点进行迭代。对于每个TextNode,打印内容。对于每个元素,检查它的子节点。 输出量

  • 我有数据 我正试图选择它与J汤。 但这不起作用。 我在字符串auth_token=处收到空指针异常。 java.lang.crime.ic.Main.main(Main.java: 2) 我做错了什么?

  • 如何使用JSoup(http://JSoup.org/)按标记获取元素? 但它输出:

  • 问题内容: 我正在为学校网站开发一个应用程序,并且正在使用jsoup解析html。 我遇到了验证码图片的问题,我看到了这个问题,并且已经实现了,但是没有获得与网站上显示的图片相同的图片。 我如何获得相同的图像验证码,该网站正在使用BotDetectCaptcha我有点困惑,我该如何在我的网站上专门进行验证 问题答案: 如SLaks的评论所述,您可能缺少一些cookie。 这是提供的网址的工作示例:

  • 问题内容: 我正在使用此代码检索本页主要文章中的文本。 问题是textview中没有显示任何内容。我要检索的文字都没有出现。Log.i与调试日志中的段一起显示。因此,我知道其连接成功。只是不知道为什么即时通讯没有在textview中获取任何文本。 问题答案: 以下是您问题的相关摘要: 您在这里犯了一个根本性的错误。文档中没有HTML标签。但是,有一个。根据有关Jsoup食谱一半的CSS选择器概述,