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";

これは、Web サイトに固有の URL です。6 つの変数に手動で数字を入力して「scrapeWebsite」を実行すると、正しい出力が得られるため、スキャナー メソッドの問題だと思います。次の形式の日付の入力セットを 1 つも取得できません。

1/1/2013 to 1/7/2013

「スターター」メソッドの何が問題なのかわかりません

4

2 に答える 2

0

自体に問題はありませんScanner。リクエストで整形式でない JavaScript を取得するだけの問題です。HtmlUnit はそれを解析しようとしますが、例外をスローして失敗します。

この回答に、この問題に関するいくつかのアイデアを追加しました。

それとは別に、setThrowExceptionOnScriptError(false)で常に例外を抑制することができます。

これにより、例外は解決されますが、javascript コードの問題は修正されません。問題を引き起こしている JavaScript 関数がたまたまデータ抽出プロセスの重要な部分である場合、HtmlUnit によって処理される Javascript を忘れて、AJAX 要求のコーディングを開始する以外に選択肢はありません。一方、Javascript 関数が必要な実際の処理とは関係がない場合は、これでうまくいく可能性が高くなります。

この問題は、HtmlUnit での Web スクレイピングに関しては非常に一般的です。

于 2013-11-06T22:08:16.390 に答える
0

私が最初に気付いた問題は、次の行でした

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

スキャナはテキスト "inputfile.txt" を読み取っています。そのため、新しいファイル ("inputfile.txt") に置き換えてみてください。ただし、このクラスを別のクラスで使用する場合は、ディレクトリ全体を使用することをお勧めします。たとえば、"\C:\programdata\Connors file\inputfile.txt" これは例であるため、ディレクトリを取得する最も簡単な方法は、フォルダーに移動することです。ファイルのプロパティを右クリックしてディレクトリをコピーし、\inputfile.txt を追加します。これが役立つかどうか教えてください。

Ps。緊急の場合 Scanner sc = new Scanner(new File("inputfile.txt")).useDelimiter("delimiter");

于 2014-10-09T15:08:22.523 に答える