java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java提取网页树节点URL

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

作者:爱的叹息

本文介绍Java提取网页树节点URL的三种方法:Jsoup(静态页面解析,不支持动态内容)、Selenium(动态渲染,需WebDriver)、HttpClient+Jsoup(静态页面细粒度控制),根据需求选择合适工具,需要的朋友可以参考下

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

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

常见的实现方式包括:

下面分别介绍这几种方法,并提供对应的 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文