使用HtmlUnit时出错

时间:2012-06-28 16:47:35

标签: java javascript web web-scraping htmlunit

当我执行这个简单的代码以将网站内容作为文本时,它会显示我无法理解的错误。

import java.io.IOException;
import java.net.MalformedURLException;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.ScriptException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class sd {
    public static void main(String[] args) {
        sd vip=new sd();
        try {
            vip.homePage();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.print("sssss");
    }

    public void homePage() throws Exception, ScriptException {
        final WebClient webClient = new WebClient();
        final HtmlPage page =       
    (HtmlPage)webClient.getPage("http://timesofindia.indiatimes.com/");
        String pageAsText = page.asText();
        String pageAsXML = page.asXml();

        // System.out.println(pageAsXML);
        System.out.println("////////////////////output//////////////////////////"); 
        System.out.println(pageAsText);
        // System.out.println(pageAsXML);
        System.out.println("////////////////////output ends//////////////////////////"); 
    }

}

我得到的错误:

   ======= EXCEPTION START ========
Exception class=[com.gargoylesoftware.htmlunit.ScriptException]
com.gargoylesoftware.htmlunit.ScriptException: Exception invoking jsxFunction_write
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:595)
Caused by: java.lang.RuntimeException: Exception invoking jsxFunction_write
Caused by: com.gargoylesoftware.htmlunit.ScriptException: Exception invoking jsxFunction_write
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:595)

3 个答案:

答案 0 :(得分:22)

自HtmlUnit版本2.11以来,不推荐使用WebClient::setThrowExceptionOnScriptError方法。在较新版本中使用以下内容:

webClient.getOptions().setThrowExceptionOnScriptError(false);

答案 1 :(得分:5)

将您的webClient设置为不抛出javascript异常

  

webClient.setThrowExceptionOnScriptError(假);

如果不是enougth,请在初始化webclient时将FF设置为客户端行为。

  

webClient = new WebClient(BrowserVersion.FIREFOX_3_6);   webClient = new WebClient(BrowserVersion.FIREFOX_10); //取决于HtmlUnit版本

答案 2 :(得分:0)

即使我有这个错误。设置WebClient以抑制错误的此选项适用于基本网站。但随着网站变得复杂,它确实失败了

经过多次试验,我最终不得不选择Phantomjs。它是用C ++编写的。我必须使用phantomjs写一些scripts然后execute。该脚本将加载url并将数据写入文件。

一旦该文件准备就绪,我会编写一个java程序来加载文件数据,然后对该文件进行操作。为了加载和抓取数据,我使用了Jsoup

如您所见,HtmlUnit,Jaunt,Jsoup支持完整的HTML,CSS。他们缺少的是他们不完全支持Javascript。这是错误的主要原因,例如抛出异常,完整页面没有加载等等。