2016-11-17 6 views
7

htmlunitを使用してウェブサイトをクロールしようとしています。それだけで次のエラーを出力しても、私はそれを実行するたびに:htmlunit未定義からプッシュを読み取ることができません

Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "push" from undefined (https://www.kinoheld.de/dist/prod/0.4.7/widget.js#1) 

今私は、JSについてあまり知らないが、私はpushは、アレイ動作のいくつかの種類であることを読みました。これは私にとって標準的だと私はなぜhtmlunitでサポートされないのか分からない。ここで

は、私がこれまでのコードを使用していている:

public static void main(String[] args) throws IOException { 
    WebClient web = new WebClient(BrowserVersion.FIREFOX_45); 
    web.getOptions().setUseInsecureSSL(true); 
    String url = "https://www.kinoheld.de/kino-muenchen/royal-filmpalast/vorstellung/280823/?mode=widget&showID=280828#panel-seats"; 
    web.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    web.waitForBackgroundJavaScript(9000); 
    HtmlPage response = web.getPage(url); 

    System.out.println(response.getTitleText()); 
} 

私は何をしないのですか?これを回避する方法やこれを解決する方法はありますか? ありがとうございます!

+1

サポートされていない場合は、開発者に新しい機能をリクエストする必要があります。 –

+0

エラーはいつ発生しますか? 'web.getPage(url)'や 'response.getTitleText()'コールの後に? – Jack

+0

@Jack 'web.getPage(url)'の後にエラーが発生します。 'web.getOptions()。setThrowExceptionOnScriptError(false)が返されたときでも、' response.getTitleText() ); '(下記の回答を参照)が挿入されています。 – Maverick283

答えて

4

私は前に同様の問題が発生しました。これは、HTMLユニットがWebをスクラップするのではなく、テストハーネスフレームワークとして設計されている問題です。 HTMLユニットの最新バージョンを実行していますか?

私は両方setThrowExceptionOnScriptError(false)(コーヒーコンバータの答えで述べたように)行を追加するだけでなく、ログ・ダンプを無効にする方法の上部に java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); を追加することで、あなたのコードを実行することができました。これは、の出力が得られた:

Royal Filmpalast München München | kinoheld.de 

完全なコードを次のようになります。

public static void main(String[] args) throws IOException { 

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 

    WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); 
    String url = "https://www.kinoheld.de/kino-muenchen/royal-filmpalast/vorstellung/280823/?mode=widget&showID=280828#panel-seats"; 

    webClient.getOptions().setUseInsecureSSL(true); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    webClient.waitForBackgroundJavaScript(9000); 
    HtmlPage response = webClient.getPage(url); 

    System.out.println(response.getTitleText()); 
} 

これは、HTMLユニット2.2.1とRedHatのコマンドラインで実行されました。お役に立てれば。

6

てみてください、あなたがページを取得しようとする前に

web.getOptions().setThrowExceptionOnScriptError(false); 

を追加します。これにより、htmlunitはエラーを無視します。しかし、例えば、エラーをスローするjavascriptがあなたが廃棄しているデータを取得するために重要である場合(これはうまくいけない)、これは100%の時間では動作しない可能性があります。それでも問題が解決しない場合は、ChromeDriverまたはGhostDriverでSeleniumを使用してみてください。

Source

+0

その行を追加すると動作しませんが、同じエラーがスローされてどこにも届きません...後でSeleniumを試してみます。 – Maverick283

+0

元の例外がスタックに入る前トレースすると、あなたが示唆した行で 'com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify'と表示され、残りのスタックトレースが表示されます。 – Maverick283

+2

私は本当に私は50点を分割することができればいいと思うが、@ジャックの答えは黙って質問を解決したが、あなたの提案は長いショットで私のためにもっと役立つかもしれない... – Maverick283

関連する問題