java - 在 Java 中使用扫描器的问题

标签 java htmlunit

我正在编写一个程序,需要从输入文本文件中读取数据,并根据日期保存变量。我正在使用 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

我不确定“starter”方法有什么问题

最佳答案

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

我已经添加到这个 answer关于这个问题的一些想法。

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

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

当涉及到 HtmlUnit 中的网页抓取时,这个问题非常普遍。

关于java - 在 Java 中使用扫描器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822594/

相关文章:

java - 如何向数组添加数组?

java - IBM as400 假脱机文件读取

java - Matlab Builder JA - 将 Matlab 编译成 Java jar - 免费版本?

.net - HtmlUnit 不等待 AJAX 执行

java - HtmlUnit 发布表单?

java - 为什么此标记生成器返回不正确的值?

java - 覆盖继承中的字段类型以进行 GSON 序列化

java - 如何在 HtmlUnit 中将 HtmlPage 转换为 Html 字符串

java - HtmlUnit 无法自动登录网站

java - 如何强制 HtmlUnit 在 GWT 测试用例中解析 UTF-8 中的 Javascript 文件?