You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java HtmlUnit定位动态ID元素及匹配特定规则的h3标签

使用HtmlUnit定位带动态ID的Tomcat发布信息h3标签

嘿,我来帮你搞定用HtmlUnit抓取那些带动态ID的Tomcat发布h3标签的问题!下面是具体的实现步骤和代码,亲测有效:

第一步:引入HtmlUnit依赖

如果用Maven管理项目,先在pom.xml里添加最新稳定版依赖:

<dependency>
    <groupId>org.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.70.0</version>
</dependency>

第二步:核心实现代码

下面的代码会模拟浏览器加载页面,用两种方式(CSS选择器和XPath)定位符合条件的h3标签,还能提取发布版本和日期:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.H3;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

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

public class TomcatReleaseScraper {
    public static void main(String[] args) {
        // 用try-with-resources自动关闭WebClient资源
        try (WebClient webClient = new WebClient()) {
            // 配置WebClient适配动态页面:启用JS、等待AJAX加载、忽略无关错误
            webClient.getOptions().setJavaScriptEnabled(true);
            webClient.getOptions().setCssEnabled(false); // 关闭CSS提升抓取速度
            webClient.getOptions().setThrowExceptionOnScriptError(false); // 忽略JS错误避免程序中断
            webClient.waitForBackgroundJavaScript(5000); // 等待5秒让动态内容加载完成

            // 替换成你要抓取的目标页面URL
            HtmlPage page = webClient.getPage("https://tomcat.apache.org/download-90.cgi");

            // 方式1:用CSS选择器定位ID以'Tomcat_'开头且以'_Released'结尾的h3
            List<H3> cssMatchedH3s = page.querySelectorAll("h3[id^='Tomcat_'][id$='_Released']");

            // 方式2:用XPath做同样的定位
            List<H3> xpathMatchedH3s = page.getByXPath("//h3[starts-with(@id, 'Tomcat_') and ends-with(@id, '_Released')]");

            // 输出CSS选择器的结果
            System.out.println("=== 通过CSS选择器找到的Tomcat发布信息 ===");
            for (H3 h3 : cssMatchedH3s) {
                String releaseInfo = h3.getTextContent().trim();
                String releaseDate = h3.querySelector(".pull-right").getTextContent().trim();
                System.out.printf("- %s | 发布日期:%s%n", releaseInfo, releaseDate);
            }

            // 输出XPath的结果(和上面结果一致,选一种就行)
            System.out.println("\n=== 通过XPath找到的Tomcat发布信息 ===");
            for (H3 h3 : xpathMatchedH3s) {
                String releaseInfo = h3.getTextContent().trim();
                String releaseDate = h3.querySelector(".pull-right").getTextContent().trim();
                System.out.printf("- %s | 发布日期:%s%n", releaseInfo, releaseDate);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键细节说明

  • 动态页面适配:很多现代页面用AJAX渲染内容,必须启用JavaScript并等待背景脚本执行,否则会抓不到动态生成的h3标签
  • 选择器语法:
    • CSS选择器里的[id^='Tomcat_']表示ID以Tomcat_开头,[id$='_Released']表示以_Released结尾
    • XPath里的starts-with(@id, 'Tomcat_')和ends-with(@id, '_Released')是对应的规则
  • 内容提取:getTextContent()能拿到h3里的纯文本,querySelector(".pull-right")可以定位到右侧的日期元素

注意事项

  • 记得替换代码里的目标页面URL为你实际要抓取的地址
  • 如果页面加载较慢,可以调整waitForBackgroundJavaScript()的等待时间(单位:毫秒)
  • 如果遇到SSL证书问题,可以添加webClient.getOptions().setUseInsecureSSL(true);来忽略证书验证

内容的提问来源于stack exchange,提问作者Programming-Lover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:21:44