2016-11-17 1 views
7

Ich versuche, eine Website mit htmlunit zu crawlen. Jedes Mal, wenn ich es laufen, obwohl nur er gibt den folgenden Fehler:htmlunit Kann Eigenschaft nicht lesen "push" von undefined

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) 

Nun weiß ich nicht viel über JS, aber ich gelesen, dass push eine Art Array Betrieb ist. Dies scheint mir Standard zu sein und ich weiß nicht, warum es von htmlunit nicht unterstützt wird.

Hier den Code verwende ich so weit:

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()); 
} 

Was bin ich? Gibt es einen Weg um dies oder eine Möglichkeit, dies zu beheben? Vielen Dank im Voraus!

+1

Wenn es nicht unterstützt wird, sollten Sie die Entwickler nach einem neuen Feature fragen. –

+0

Wann tritt der Fehler auf? Nach dem 'web.getPage (URL)' oder dem 'response.getTitleText()' Aufruf? – Jack

+0

@Jack Der Fehler tritt nach der 'web.getPage (url)' auf, da ich die 'response.getTitleText()' auskommentieren kann und sie wird auch dann noch geworfen, wenn 'web.getOptions(). SetThrowExceptionOnScriptError (false); '(siehe Antwort unten) wird eingefügt. – Maverick283

Antwort

4

Ich habe vor ein ähnliches Problem aufgetreten. Dies ist ein Problem, bei dem die HTML-Unit eher als Framework für die Testumgebung konzipiert ist als für die Web-Scraping-Umgebung. Führen Sie die neueste Version von HTML Unit aus?

konnte ich Ihren Code auszuführen, indem sowohl die setThrowExceptionOnScriptError(false) Zugabe Linie sowie das Hinzufügen java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); an der Spitze des Verfahrens (wie in Coffee Converter Antwort erwähnt), um die Log-Sicherung zu deaktivieren. Dies ergab eine Leistung von:

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

Voll Code ist wie folgt:

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()); 
} 

Diese auf RedHat Kommandozeile mit HTML-Einheit 2.2.1 ausgeführt wurde. Hoffe das hilft.

6

Versuchen Zugabe

web.getOptions().setThrowExceptionOnScriptError(false); 

, bevor Sie versuchen, die Seite zu bekommen. Dies zwingt htmlunit, den Fehler zu ignorieren. Dies funktioniert jedoch möglicherweise nicht zu 100%, wenn zum Beispiel das JavaScript, das den Fehler auslöst, wichtig ist, um die Daten zu erhalten, die Sie verschrotten (was hoffentlich nicht der Fall ist). Wenn das nicht funktioniert, verwenden Sie Selenium mit ChromeDriver oder GhostDriver.

Source

+0

Das Hinzufügen dieser Zeile funktioniert nicht, es löst immer noch den gleichen Fehler aus und bringt mich nirgendwohin ... Ich werde versuchen, was Selenium später ist, wenn ich mehr Zeit habe;) – Maverick283

+0

Aber bevor die ursprüngliche Ausnahme im Stapel ist Trace, mit der Zeile, die Sie vorgeschlagen haben, heißt es jetzt "com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify" und druckt dann den Rest des Stack-Trace. – Maverick283

+2

Ich wünschte wirklich, ich könnte die 50 Punkte aufteilen, während @Jacks Antwort tatsächlich die Frage gelöst hat, könnte Ihr Vorschlag mehr hilfreich für mich auf lange Sicht sein ... – Maverick283

Verwandte Themen