前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 报错信息 Error during JavaScript execution

Java 报错信息 Error during JavaScript execution

作者头像
heasy3
发布2020-08-02 14:07:19
1.4K0
发布2020-08-02 14:07:19
举报
文章被收录于专栏:用户7614879的专栏

进行各种各样的网页爬虫过程中,有些网页直接httpclient拿过来就能用,但是有些网站是需要等待js加载样式或者某些值的,使用httpclient没办法设置js等待时间,然后再抓取值。

htmlunit可以完美解决这个问题。但是在使用htmlunit访问网页时 经常会出现各种网页的JavaScript加载过程中的警告与提示信息 例如:

ERROR c.g.h.javascript.DefaultJavaScriptErrorListener - Error during JavaScript execution com.gargoylesoftware.htmlunit.ScriptException: URIError: Malformed URI sequence.

在代码中已经对WebClient进行设置了webClient.getOptions().setThrowExceptionOnScriptError(false);

并不能关闭这些提示信息 导致每次访问网页都会打印一大串一大串的无用信息

我并不关心他js报什么错,我只关心拿下来页面的结果。通过查看这个报错类,重写它里面的方法,把所有log输出语句全部删除,就可以达到不打印错误信息的作用了。

类路径是:com.gargoylesoftware.htmlunit.javascript.DefaultJavaScriptErrorListener

解决方法代码如下

代码语言:javascript
复制
private String getTimeByHtmlUnit(String url) throws IOException {
	if (StringUtils.isBlank(url)) {
		return "";
	}
	WebClient webClient = new WebClient(BrowserVersion.CHROME);
	webClient.getOptions().setJavaScriptEnabled(true);
	webClient.getOptions().setCssEnabled(false);
	webClient.getOptions().setActiveXNative(false);
	webClient.getOptions().setThrowExceptionOnScriptError(false);
	webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
	webClient.getOptions().setTimeout(5000);
    // -----重点-----设置为我们自定义的错误处理类
	webClient.setJavaScriptErrorListener(new MyJSErrorListener());
	webClient.setJavaScriptTimeout(5000);
	HtmlPage page = webClient.getPage(url);
	//wait for js execute
	webClient.waitForBackgroundJavaScript(3000);
    //这里是我的爬取目标 忽略即可
	DomNodeList<DomElement> domElements = page.getElementsByTagName("relative-time");
	if (domElements.isEmpty()) {
		return "";
	}
	return domElements.get(0).getAttribute("datetime");
}

/**
 * 忽略html unit打印的所有js加载报错信息
 */
public class MyJSErrorListener extends DefaultJavaScriptErrorListener {
	@Override
	public void scriptException(HtmlPage page, ScriptException scriptException) {
	}

	@Override
	public void timeoutError(HtmlPage page, long allowedTime, long executionTime) {
	}

	@Override
	public void malformedScriptURL(HtmlPage page, String url, MalformedURLException malformedURLException) {

	}

	@Override
	public void loadScriptError(HtmlPage page, URL scriptUrl, Exception exception) {

	}

	@Override
	public void warn(String message, String sourceName, int line, String lineSource, int lineOffset) {

	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档