如何用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')是对应的规则
- CSS选择器里的
- 内容提取:
getTextContent()能拿到h3里的纯文本,querySelector(".pull-right")可以定位到右侧的日期元素
注意事项
- 记得替换代码里的目标页面URL为你实际要抓取的地址
- 如果页面加载较慢,可以调整
waitForBackgroundJavaScript()的等待时间(单位:毫秒) - 如果遇到SSL证书问题,可以添加
webClient.getOptions().setUseInsecureSSL(true);来忽略证书验证
内容的提问来源于stack exchange,提问作者Programming-Lover
相关产品推荐
相关产品推荐

