2013-08-03 28 views
7

Tôi cần phải phân tích trang, mọi thứ đều ổn, ngoại trừ một số yếu tố trên trang được tải động. Tôi đã sử dụng jsoup cho các yếu tố tĩnh, sau đó khi tôi nhận ra rằng tôi thực sự cần các yếu tố động, tôi đã thử javafx. Tôi đọc rất nhiều câu trả lời trên stackoverflow và có rất nhiều khuyến nghị để sử dụng javafx WebEngine. Vì vậy, tôi đã kết thúc với mã này.Làm cách nào để tải html của trang được tải đầy đủ (bằng javascript) làm đầu vào trong java?

@Override 
public void start(Stage primaryStage) { 
    WebView webview = new WebView(); 
    final WebEngine webengine = webview.getEngine(); 
    webengine.getLoadWorker().stateProperty().addListener(
      new ChangeListener<State>() { 
       public void changed(ObservableValue ov, State oldState, State newState) { 
        if (newState == Worker.State.SUCCEEDED) { 
         Document doc = webengine.getDocument(); 
         //Serialize DOM 
         OutputFormat format = new OutputFormat (doc); 
         // as a String 
         StringWriter stringOut = new StringWriter();  
         XMLSerializer serial = new XMLSerializer (stringOut, format); 
         try { 
          serial.serialize(doc); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         // Display the XML 
         System.out.println(stringOut.toString()); 
        } 
       } 
      }); 
    webengine.load("http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658"); 
    primaryStage.setScene(new Scene(webview, 800, 800)); 
    primaryStage.show(); 
} 

Tôi tạo chuỗi từ org.w3c.dom.Document và in nó. Nhưng nó cũng vô ích. primaryStage.show() cho tôi xem trang được tải đầy đủ (với phần tử tôi cần được hiển thị trên trang), nhưng không có phần tử nào tôi cần trong mã html (ở đầu ra).

Đây là ngày thứ ba tôi làm việc về vấn đề đó, tất nhiên là thiếu kinh nghiệm là vấn đề chính của tôi, tuy nhiên tôi phải nói: Tôi bị kẹt. Đây là dự án java đầu tiên của tôi sau khi đọc tài liệu tham khảo đầy đủ java. Tôi làm cho nó để có được một số kinh nghiệm thực tế (và cho vui). Tôi muốn làm phân tích cú pháp "ebay" của Trung Quốc.

Dưới đây là vấn đề và các trường hợp thử nghiệm của tôi:

http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658 nhu cầu để có được tự động nạp giảm giá "129.00"

http://item.taobao.com/item.htm?spm=a230r.1.14.67.MNq30d&id=22794120348 cần "15.20"

Như bạn có thể thấy, nếu bạn xem các trang này với trình duyệt lúc đầu bạn thấy giá gốc và sau một lần giảm giá thứ hai hoặc lâu hơn.

Thậm chí có thể nhận được mức chiết khấu động này từ trang html không? Các yếu tố khác tôi cần phân tích là tĩnh. Điều gì để thử tiếp theo: một thư viện để render html với javascript hoặc có thể smth khác? Tôi thực sự cần một số lời khuyên, không muốn từ bỏ.

Trả lời

1

mô hình DOM trở lại sau Worker.State.SUCCEEDED shoulb được đã được xử lý bằng javascript.

Mã của bạn đã hoạt động với tôi khi được thử nghiệm với FX 7u40 và 8.0 dev. Tôi thấy đầu ra tiếp theo trong nhật ký:

<DIV id="J_PromoBox"><EM class="tb-promo-price-type">夏季新品</EM><EM class="tm-yen">¥</EM>  
<STRONG class="J_CurPrice">129.00</STRONG></DIV> 

là hộp được nạp động với dữ liệu (129.00) mà bạn đã tìm kiếm.

Bạn có thể muốn nâng cấp JDK lên 7u40 hoặc truy cập lại thuật toán phân tích nhật ký của mình.

0

Có vẻ như bạn muốn DOM được hiển thị từ trang động sau khi Javascript trên trang đã hoàn thành việc sửa đổi HTML gốc. Điều này sẽ không dễ dàng thực hiện trong Java vì bạn sẽ cần phải thực hiện chức năng giống như trình duyệt với một công cụ Javascript được nhúng. Nếu bạn chỉ quan tâm đến việc đọc một trang web từ Java, bạn có thể muốn xem xét Selenium vì nó kiểm soát trình duyệt và cho phép bạn kéo HTML được hiển thị vào Java.

Câu trả lời này cũng có thể giúp:

Render JavaScript and HTML in (any) Java Program (Access rendered DOM Tree)?

+0

Cảm ơn! Tôi đang đọc tài liệu selenium, hy vọng điều này sẽ giúp ích cho bạn. Ngoài ra tôi không thực sự cần phải render trang, tôi chỉ cần xử lý html như là một đầu vào để phân tích thêm. – rivf

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