Java提取网页树节点URL的三种高效方法

 更新时间:2025年08月21日 10:13:42   作者:爱的叹息  
本文介绍Java提取网页树节点URL的三种方法:Jsoup(静态页面解析,不支持动态内容)、Selenium(动态渲染,需WebDriver)、HttpClient+Jsoup(静态页面细粒度控制),根据需求选择合适工具,需要的朋友可以参考下

在 Java 中获取网页上某个树结构的某个节点的所有下级节点的 URL,通常需要以下几个步骤:

  1. 下载网页内容(HTTP 请求)。
  2. 解析 HTML 内容(使用 HTML 解析器)。
  3. 定位目标节点并提取其子节点的 URL

常见的实现方式包括:

  • 使用 Jsoup 进行 HTML 解析。
  • 使用 Selenium 进行动态页面处理(如果页面是通过 JavaScript 动态生成的)。
  • 使用 HttpClient + Jsoup 的组合进行静态页面解析。

下面分别介绍这几种方法,并提供对应的 Maven 依赖和 Java 示例代码

方法一:使用 Jsoup 解析静态 HTML 页面

Maven 依赖

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.16.1</version>
</dependency>

Java 示例代码

假设你要从一个静态 HTML 页面中找到某个具有特定 ID 的树节点,并提取它的所有子节点的 href 属性。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class TreeUrlParser {

    public static List<String> getChildUrls(String url, String targetNodeId) throws IOException {
        Document doc = Jsoup.connect(url).get();
        Element targetNode = doc.getElementById(targetNodeId);

        List<String> childUrls = new ArrayList<>();

        if (targetNode != null) {
            Elements links = targetNode.select("a[href]");
            for (Element link : links) {
                String href = link.absUrl("href"); // 获取绝对路径
                childUrls.add(href);
            }
        }

        return childUrls;
    }

    public static void main(String[] args) {
        try {
            List<String> urls = getChildUrls("https://example.com/tree-page", "tree-node-id");
            urls.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方法二:使用 Selenium 处理动态加载的树结构

如果树结构是通过 JavaScript 动态加载的,则需要使用浏览器自动化工具如 Selenium 来渲染页面。

Maven 依赖

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.19.0</version>
</dependency>

还需要下载 WebDriver(如 ChromeDriver)。

Java 示例代码

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.ArrayList;
import java.util.List;

public class DynamicTreeUrlParser {

    public static List<String> getChildUrls(String pageUrl, String targetNodeId) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

        WebDriver driver = new ChromeDriver();
        driver.get(pageUrl);

        WebElement targetNode = driver.findElement(By.id(targetNodeId));
        List<WebElement> links = targetNode.findElements(By.tagName("a"));

        List<String> childUrls = new ArrayList<>();
        for (WebElement link : links) {
            String href = link.getAttribute("href");
            if (href != null && !href.isEmpty()) {
                childUrls.add(href);
            }
        }

        driver.quit();
        return childUrls;
    }

    public static void main(String[] args) {
        List<String> urls = getChildUrls("https://example.com/dynamic-tree-page", "tree-node-id");
        urls.forEach(System.out::println);
    }
}

方法三:结合 Apache HttpClient 和 Jsoup

如果你希望使用更底层的 HTTP 客户端来控制请求细节,可以使用 HttpClient

Maven 依赖

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.2.1</version>
</dependency>
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.16.1</version>
</dependency>

Java 示例代码

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpEntity;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class HttpClientJsoupParser {

    public static List<String> getChildUrls(String url, String targetNodeId) throws Exception {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet request = new HttpGet(url);

        ClassicHttpResponse response = httpClient.execute(request);
        HttpEntity entity = response.getEntity();

        List<String> childUrls = new ArrayList<>();

        if (entity != null) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
            StringBuilder content = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {
                content.append(line);
            }

            Document doc = Jsoup.parse(content.toString());
            org.jsoup.nodes.Element targetNode = doc.getElementById(targetNodeId);

            if (targetNode != null) {
                targetNode.select("a[href]").forEach(link -> {
                    childUrls.add(link.absUrl("href"));
                });
            }
        }

        return childUrls;
    }

    public static void main(String[] args) {
        try {
            List<String> urls = getChildUrls("https://example.com/tree-page", "tree-node-id");
            urls.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

方法工具是否支持动态内容适用场景
方法一Jsoup❌ 不支持静态 HTML 页面解析
方法二Selenium✅ 支持动态 JavaScript 渲染页面
方法三HttpClient + Jsoup❌ 不支持更细粒度的 HTTP 请求控制

你可以根据实际需求选择合适的方法。

到此这篇关于Java提取网页树节点URL的三种高效方法的文章就介绍到这了,更多相关Java提取网页树节点URL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入浅出讲解Java中的枚举类

    深入浅出讲解Java中的枚举类

    这篇文章主要介绍了深入浅出讲解Java中的枚举类,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java数据结构实现二维数组与稀疏数组转换详解

    Java数据结构实现二维数组与稀疏数组转换详解

    稀疏数组是用于优化,压缩具有以下特点的二维数组:当二维数组中的元素大部分相同,有意义的数据元素较少时,可以使用稀疏数组进行简化,节省存储空间
    2021-10-10
  • java的JIT 工作原理简单介绍

    java的JIT 工作原理简单介绍

    这篇文章主要介绍了java的JIT 工作原理简单介绍的相关资料,需要的朋友可以参考下
    2017-03-03
  • 命令提示符编译java的方法(必看篇)

    命令提示符编译java的方法(必看篇)

    下面小编就为大家带来一篇命令提示符编译java的方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • RocketMQ Broker消息如何刷盘源码解析

    RocketMQ Broker消息如何刷盘源码解析

    这篇文章主要为大家介绍了RocketMQ Broker消息如何刷盘源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • java使用JWT的方法

    java使用JWT的方法

    这篇文章主要介绍了java使用JWT的方法,JWT是token的一种,一个JWT字符串包含三个部分分别是Header、Payload和Signature,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • SSM框架整合之Spring+SpringMVC+MyBatis实践步骤

    SSM框架整合之Spring+SpringMVC+MyBatis实践步骤

    大家都知道Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,本文主要介绍三大框架的整合包含spring和mybatis的配置文件,还有spring-mvc的配置文件的详细介绍,通过项目实践步骤给大家详细介绍,感兴趣的朋友一起看看吧
    2021-06-06
  • SpringMVC @RequestMapping的使用演示和细节展示

    SpringMVC @RequestMapping的使用演示和细节展示

    本文详细介绍了SpringMVC中@RequestMapping注解的用法,包括其映射请求、参数配置、Ant风格URL、与@PathVariable结合使用,以及如何通过@Controller实现POJO作为控制器,强调掌握该注解对SpringMVC开发的重要性,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • spring-kafka使消费者动态订阅新增的topic问题

    spring-kafka使消费者动态订阅新增的topic问题

    这篇文章主要介绍了spring-kafka使消费者动态订阅新增的topic问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • IDEA中使用tomcat部署项目全过程

    IDEA中使用tomcat部署项目全过程

    文章介绍了如何在IDEA中打开并设置Tomcat项目,包括设置JDK版本、添加模块、配置web.xml路径等步骤,然后详细说明了如何配置Tomcat并部署工件,以及如何启动Tomcat进行访问
    2026-03-03

最新评论