2016-11-17 25 views
7

Tôi đang cố thu thập dữ liệu trang web bằng htmlunit. Bất cứ khi nào tôi chạy nó mặc dù nó chỉ xuất ra lỗi sau:htmlunit Không thể đọc thuộc tính "đẩy" từ không xác định

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) 

Bây giờ tôi không biết nhiều về JS, nhưng tôi đọc rằng push là một loại hoạt động mảng. Điều này có vẻ tiêu chuẩn đối với tôi và tôi không biết tại sao nó sẽ không được hỗ trợ bởi htmlunit.

Dưới đây là đoạn code Tôi đang sử dụng cho đến nay:

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

tôi thiếu gì? Có cách nào để giải quyết vấn đề này hay không? Cảm ơn bạn trước!

+1

Nếu nó không được hỗ trợ, tôi đoán bạn nên yêu cầu các nhà phát triển cho một tính năng mới. –

+0

Khi nào lỗi xảy ra? Sau cuộc gọi 'web.getPage (url)' hoặc 'response.getTitleText()'? – Jack

+0

@Jack Lỗi xảy ra sau 'web.getPage (url)', vì tôi có thể nhận xét 'response.getTitleText()' và nó vẫn sẽ bị ném, ngay cả khi 'web.getOptions(). SetThrowExceptionOnScriptError (false); '(xem câu trả lời dưới đây) được chèn vào. – Maverick283

Trả lời

4

Tôi đã gặp phải vấn đề tương tự trước đây. Đây là một vấn đề với đơn vị HTML được thiết kế như một khung khai thác thử nghiệm thay vì một trang web cạo một. Bạn có đang chạy phiên bản mới nhất của đơn vị HTML không?

tôi đã có thể chạy mã của bạn bằng cách thêm cả setThrowExceptionOnScriptError(false) (như đã đề cập trong câu trả lời Coffee Chuyển đổi của) dòng cũng như thêm java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); ở phía trên cùng của phương pháp này để vô hiệu hóa các bãi chứa log. Việc này mang lại công suất:

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

Full mã như sau:

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

này được chạy trên dòng lệnh RedHat với HTML Unit 2.2.1. Hi vọng điêu nay co ich.

6

Hãy thử thêm

web.getOptions().setThrowExceptionOnScriptError(false); 

trước khi bạn cố gắng để có được trang. Điều này buộc htmlunit bỏ qua lỗi. Tuy nhiên, điều này có thể không làm việc 100% thời gian nếu ví dụ javascript ném lỗi là rất quan trọng để có được dữ liệu bạn đang loại bỏ (mà nó hy vọng là không). Nếu cách này không hiệu quả, hãy thử sử dụng Selenium với ChromeDriver hoặc GhostDriver.

Source

+0

Thêm dòng đó không hoạt động, nó vẫn ném cùng một lỗi và không nhận được tôi bất cứ nơi nào ... Tôi sẽ thử bất cứ điều gì Selenium là sau khi tôi có nhiều thời gian hơn;) – Maverick283

+0

Nhưng trước khi ngoại lệ ban đầu là trong ngăn xếp theo dõi, với dòng bạn đề xuất, bây giờ nó nói 'com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl thông báo' và sau đó in phần còn lại của dấu vết ngăn xếp. – Maverick283

+2

Tôi thực sự muốn tôi có thể chia 50 điểm lên, trong khi câu trả lời của @Jack đã giải quyết một cách acutally câu hỏi, đề xuất của bạn có thể hữu ích hơn cho tôi trong một cảnh quay dài ... – Maverick283

Các vấn đề liên quan