Java提取網(wǎng)頁樹節(jié)點(diǎn)URL的三種高效方法
在 Java 中獲取網(wǎng)頁上某個(gè)樹結(jié)構(gòu)的某個(gè)節(jié)點(diǎn)的所有下級節(jié)點(diǎn)的 URL,通常需要以下幾個(gè)步驟:
- 下載網(wǎng)頁內(nèi)容(HTTP 請求)。
- 解析 HTML 內(nèi)容(使用 HTML 解析器)。
- 定位目標(biāo)節(jié)點(diǎn)并提取其子節(jié)點(diǎn)的 URL。
常見的實(shí)現(xiàn)方式包括:
- 使用
Jsoup進(jìn)行 HTML 解析。 - 使用
Selenium進(jìn)行動(dòng)態(tài)頁面處理(如果頁面是通過 JavaScript 動(dòng)態(tài)生成的)。 - 使用
HttpClient+Jsoup的組合進(jìn)行靜態(tài)頁面解析。
下面分別介紹這幾種方法,并提供對應(yīng)的 Maven 依賴和 Java 示例代碼
方法一:使用 Jsoup 解析靜態(tài) HTML 頁面
Maven 依賴
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
Java 示例代碼
假設(shè)你要從一個(gè)靜態(tài) HTML 頁面中找到某個(gè)具有特定 ID 的樹節(jié)點(diǎn),并提取它的所有子節(jié)點(diǎn)的 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 處理動(dòng)態(tài)加載的樹結(jié)構(gòu)
如果樹結(jié)構(gòu)是通過 JavaScript 動(dòng)態(tài)加載的,則需要使用瀏覽器自動(dòng)化工具如 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);
}
}
方法三:結(jié)合 Apache HttpClient 和 Jsoup
如果你希望使用更底層的 HTTP 客戶端來控制請求細(xì)節(jié),可以使用 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();
}
}
}
總結(jié)
| 方法 | 工具 | 是否支持動(dòng)態(tài)內(nèi)容 | 適用場景 |
|---|---|---|---|
| 方法一 | Jsoup | ? 不支持 | 靜態(tài) HTML 頁面解析 |
| 方法二 | Selenium | ? 支持 | 動(dòng)態(tài) JavaScript 渲染頁面 |
| 方法三 | HttpClient + Jsoup | ? 不支持 | 更細(xì)粒度的 HTTP 請求控制 |
你可以根據(jù)實(shí)際需求選擇合適的方法。
到此這篇關(guān)于Java提取網(wǎng)頁樹節(jié)點(diǎn)URL的三種高效方法的文章就介紹到這了,更多相關(guān)Java提取網(wǎng)頁樹節(jié)點(diǎn)URL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換詳解
稀疏數(shù)組是用于優(yōu)化,壓縮具有以下特點(diǎn)的二維數(shù)組:當(dāng)二維數(shù)組中的元素大部分相同,有意義的數(shù)據(jù)元素較少時(shí),可以使用稀疏數(shù)組進(jìn)行簡化,節(jié)省存儲(chǔ)空間2021-10-10
SSM框架整合之Spring+SpringMVC+MyBatis實(shí)踐步驟
大家都知道Spring是一個(gè)輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,本文主要介紹三大框架的整合包含spring和mybatis的配置文件,還有spring-mvc的配置文件的詳細(xì)介紹,通過項(xiàng)目實(shí)踐步驟給大家詳細(xì)介紹,感興趣的朋友一起看看吧2021-06-06
SpringMVC @RequestMapping的使用演示和細(xì)節(jié)展示
本文詳細(xì)介紹了SpringMVC中@RequestMapping注解的用法,包括其映射請求、參數(shù)配置、Ant風(fēng)格URL、與@PathVariable結(jié)合使用,以及如何通過@Controller實(shí)現(xiàn)POJO作為控制器,強(qiáng)調(diào)掌握該注解對SpringMVC開發(fā)的重要性,感興趣的朋友跟隨小編一起看看吧2025-09-09
spring-kafka使消費(fèi)者動(dòng)態(tài)訂閱新增的topic問題
這篇文章主要介紹了spring-kafka使消費(fèi)者動(dòng)態(tài)訂閱新增的topic問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

