Java提取网页树节点URL的三种高效方法
作者:爱的叹息
本文介绍Java提取网页树节点URL的三种方法:Jsoup(静态页面解析,不支持动态内容)、Selenium(动态渲染,需WebDriver)、HttpClient+Jsoup(静态页面细粒度控制),根据需求选择合适工具,需要的朋友可以参考下
在 Java 中获取网页上某个树结构的某个节点的所有下级节点的 URL,通常需要以下几个步骤:
- 下载网页内容(HTTP 请求)。
- 解析 HTML 内容(使用 HTML 解析器)。
- 定位目标节点并提取其子节点的 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
