使用HtmlUnit点击HtmlAnchor后获取目标URL的技术求助
解决HtmlUnit获取HtmlAnchor指向URL的问题
问题分析
你的代码核心问题是使用link.click().getWebResponse().toString()获取的是整个WebResponse的字符串内容,而非目标页面的URL。另外,你已禁用JavaScript,目标链接大概率是静态href,完全不需要点击页面就能直接提取URL,这样更高效。
解决方案
方案1:直接提取静态href(推荐)
如果链接的URL写在href属性里,直接调用HtmlAnchor的getHrefAttribute()方法即可:
public List<String> clickURLs(String searchAttribute) { List<String> list = new ArrayList<>(); // 初始化list变量 try { wc.getOptions().setCssEnabled(false); wc.getOptions().setJavaScriptEnabled(false); wc.getOptions().setUseInsecureSSL(true); wc.getOptions().setPrintContentOnFailingStatusCode(false); wc.getOptions().setThrowExceptionOnFailingStatusCode(false); wc.getOptions().setThrowExceptionOnScriptError(false); HtmlPage page = wc.getPage(url); List<HtmlAnchor> links = page.getAnchors(); for (HtmlAnchor link : links) { if (link.getTextContent().contains(searchAttribute)) { String href = link.getHrefAttribute(); // 若需要绝对URL,可转换: // String absoluteUrl = link.getPage().getFullyQualifiedUrl(href).toString(); System.out.println(href); list.add(href); } } } catch (Exception e) { System.out.println("An error occured: " + e); } finally { wc.close(); } return list; }
方案2:点击后获取目标页面URL
如果确实需要模拟点击(比如特殊跳转逻辑),点击后通过新页面的getUrl()方法获取URL:
public List<String> clickURLs(String searchAttribute) { List<String> list = new ArrayList<>(); // 初始化list变量 try { wc.getOptions().setCssEnabled(false); wc.getOptions().setJavaScriptEnabled(false); wc.getOptions().setUseInsecureSSL(true); wc.getOptions().setPrintContentOnFailingStatusCode(false); wc.getOptions().setThrowExceptionOnFailingStatusCode(false); wc.getOptions().setThrowExceptionOnScriptError(false); HtmlPage page = wc.getPage(url); List<HtmlAnchor> links = page.getAnchors(); for (HtmlAnchor link : links) { if (link.getTextContent().contains(searchAttribute)) { HtmlPage targetPage = link.click(); String targetUrl = targetPage.getUrl().toString(); System.out.println(targetUrl); list.add(targetUrl); } } } catch (Exception e) { System.out.println("An error occured: " + e); } finally { wc.close(); } return list; }
额外注意点
- 方法内的
list变量必须提前初始化,否则会出现未定义问题。 - 若提取的是相对URL,可使用
link.getPage().getFullyQualifiedUrl(href)转换为绝对URL。
内容的提问来源于stack exchange,提问作者Felix Steindorff
相关产品推荐
相关产品推荐

