我正在尝试获取网络内容 page ,即页面右侧的公寓列表(带有 class="classified"的 div 元素)。在浏览器中查看该页面时,很明显它使用了 JavaScript。
我正在使用 HtmlUnit for Java,特别是 waitForBackgroundJavaScript(10000) 方法来等待 JavaScript 完成。然而,它对我来说仍然不起作用,我得到了与初始调用相同的 HTML,没有显示公寓页面的元素。
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);
URL url = new URL("https://r.onliner.by/pk/#bounds%5Blb%5D%5Blat%5D=53.75074091071493&bounds%5Blb%5D%5Blong%5D=27.301025390625004&bounds%5Brt%5D%5Blat%5D=54.04527964804286&bounds%5Brt%5D%5Blong%5D=27.822875976562504");
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(50000);
System.out.println(page.asXml());
webClient.close();
启用setThrowExceptionOnScriptError会显示JavaScript代码中的一些异常(我不确定它是否与问题相关,因为浏览器中没有此类问题)。
我还尝试了其他一些方法,例如
// option 2
webClient.waitForBackgroundJavaScriptStartingBefore(50000);
// option 3
webClient.setJavaScriptTimeout(50000);
// option 4
JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager();
while (manager.getJobCount() > 0)
Thread.sleep(1000);
但没有任何效果。您能告诉我如何获取页面内容吗?
最佳答案
鉴于 HTMLUnit 在 JavaScript 方面存在的问题,您需要找到解决方法。知道你想要哪个元素后,你可以实现一个 while 循环。这可能看起来像这样:
while(!page.asText().contains(„<div id=\„exmaple-id\">“)){
webClient.waitForBackgroundJavaScript(500);
}
如果你害怕陷入这个循环,你可以在 while 条件中添加一个计数变量。根据我的经验,这是处理这种延迟的可靠方法吗?
关于javascript - HTMLUnit 未使用 JavaScript 返回完全加载的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57999500/