最近遇到个需求,要解析html 获取页面上的数据,但是加载的网页的有的元素是通过js动态加载完成的,只靠jsoup 无法实现,最后发现了htmlunit。
/**HtmlUnit请求web页面*/
WebClient wc = new WebClient(BrowserVersion.CHROME);
wc.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
wc.getOptions().setCssEnabled(false); //禁用css支持
wc.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
wc.getOptions().setTimeout(50000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待
HtmlPage page = wc.getPage("网页url地址");
wc.waitForBackgroundJavaScript(3 * 1000);
String pageXml = page.asXml(); //以xml的形式获取响应文本
/**jsoup解析文档*/
Document doc = Jsoup.parse(pageXml);
以为可以完美解决没想到遇到了坑,解析报错
com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: "jQuery" is not defined.
研究很久发现是依赖版本太低了,我之前是2.1.8,果断去mvn repository上找个最新的。
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.46.0</version>
</dependency>
问题解决,很nice