5

我正在编写一个程序,该程序需要从输入文本文件中读取数据,并在查看日期时保存变量。我正在使用 Htmlunit,并且遇到了错误:

com.gargoylesoftware.htmlunit.ScriptException: Exception invoking open
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:684)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591)
    at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985)
    at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:210)
    at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:230)
    at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804)
    at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738)
    at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205)
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1160)
    at Docketscraper.scrapeWebsite(Docketscraper.java:58)
    at Docketscraper.starter(Docketscraper.java:40)

我这样做的代码是:

  private static String startingMonth;
  private static String startingDay;
  private static String startingYear;
  private static String endingMonth;
  private static String endingDay;
  private static String endingYear;

  public static void starter() throws IOException{
    Scanner sc = new Scanner("inputfile.txt").useDelimiter("\\s*|/");
    while(sc.hasNext()) {
      startingMonth = sc.next();
      startingDay = sc.next();
      startingYear = sc.next();
      // skip "to"
      sc.next();
        endingMonth = sc.next();
      endingDay = sc.next();
      endingYear = sc.next();
      scrapeWebsite();
    }
  }

scrapeWebsite 运行 htmlunit 方法的地方。scrapeWebsite 方法如下,它调用一个方法来解析数据:

public static void scrapeWebsite() throws IOException {


    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage(url);
    final HtmlForm form = page.getForms().get(0);
    final HtmlElement button = form.getElementById("SheetContentPlaceHolder_C_searchresults_lbPrint");
    final HtmlPage page2 = button.click();
    try {
      synchronized (page2) {
        page2.wait(10000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = page2.getWebResponse().getContentAsString();
    obtainInformation();  
    originalHtml = "";
  }

输入变量根据代码创建要搜索的 url:

private static String url = "http://cpdocket.cp.cuyahogacounty.us/SheriffSearch/results.aspx?q=searchType%3dCity%26searchString%3d%26foreclosureType%3d%26dateFrom%3d" + startingMonth + "%2f" + startingDay + "%2f" + startingYear + "+12%3a00%3a00+AM%26dateTo%3d" + endingMonth + "%2f" + endingDay + "%2f" + endingYear + "+11%3a59%3a59+PM";

这是特定于网站的 url。我认为这是扫描仪方法的一个问题,因为当我手动输入 6 个变量的数字并运行“scrapeWebsite”时,会出现正确的输出。我什至无法运行一组输入日期,其格式为:

1/1/2013 to 1/7/2013

我不确定“启动器”方法有什么问题

4

2 回答 2

0

本身没有问题Scanner。这只是在请求中获取格式不正确的 javascript 的问题。HtmlUnit 尝试解析它,但它无法抛出异常。

我已经在这个答案中添加了一些关于这个问题的想法。

除此之外,您始终可以使用setThrowExceptionOnScriptError(false)抑制异常。

这将使您通过异常,但不会更正 javascript 代码中的任何问题。如果给您带来麻烦的 javascript 函数恰好是您的数据提取过程中的关键部分,那么您将别无选择,只能忘记 HtmlUnit 处理的 Javascript 并开始自己编写 AJAX 请求。另一方面,如果 Javascript 函数与您需要的实际处理没有任何关系,那么这很可能会起作用。

在 HtmlUnit 中进行网页抓取时,此问题非常常见。

于 2013-11-06T22:08:16.390 回答
0

我注意到的第一个问题是这条线

Scannersc = new Scanner("inputfile.txt").useDelimiter("\\s*|/");

扫描仪现在正在读取文本“inputfile.txt”。因此请尝试将其替换为 new File("inputfile.txt"); 但是如果你在另一个类中使用这个类,最好有整个目录,例如“\C:\programdata\Connors file\inputfile.txt”这是一个例子,所以最简单的获取目录的方法是转到文件夹它在里面,右键单击文件属性并复制目录并添加\inputfile.txt。请让我知道这可不可以帮你。

附言。紧急情况下 Scanner sc = new Scanner(new File("inputfile.txt")).useDelimiter("delimiter");

于 2014-10-09T15:08:22.523 回答