2013-08-03 10 views
7

Potrzebuję parsować stronę, wszystko jest w porządku, z wyjątkiem niektórych elementów na stronie ładowanych dynamicznie. Użyłem jsoup dla elementów statycznych, a kiedy zdałem sobie sprawę, że naprawdę potrzebuję elementów dynamicznych, wypróbowałem javafx. Czytałem wiele answeres na stackoverflow i było wiele zaleceń do używania javafx WebEngine. Więc skończyłem z tym kodem.Jak pobrać html z w pełni załadowanej strony (z javascript) jako dane wejściowe w 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(); 
} 

Zrobiłem napis z org.w3c.dom.Document i wydrukowałem go. Ale to też było bezużyteczne. primaryStage.show() pokazał mi w pełni załadowaną stronę (z elementem, który muszę wyrenderować na stronie), ale nie było elementu, którego potrzebuję w kodzie HTML (na wyjściu).

To już trzeci dzień, nad którym pracuję, oczywiście brak doświadczenia jest moim głównym problemem, niemniej muszę powiedzieć: utknąłem. To jest mój pierwszy projekt java po przeczytaniu kompletnego odwołania java. Robię to, aby uzyskać pewne doświadczenie w świecie rzeczywistym (i dla zabawy). Chcę stworzyć parser chińskiego "ebay".

Tutaj jest problem i moje przypadki testowe:

http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658 potrzeba, aby załadowane dynamicznie zniżkę "129.00"

http://item.taobao.com/item.htm?spm=a230r.1.14.67.MNq30d&id=22794120348 potrzebę "15.20"

Jak widać, jeśli zobaczyć te strony z przeglądarką na początku widzisz oryginalną cenę i po mniej więcej sekundzie - zniżka.

Czy jest możliwe uzyskanie dynamicznych rabatów ze strony html? Inne elementy, które muszę przeanalizować, są statyczne. Co dalej wypróbować: inna biblioteka do renderowania html z javascript lub może coś jeszcze? Naprawdę potrzebuję porady, nie chcę się poddawać.

Odpowiedz

1

modelu DOM zwrócone po Worker.State.SUCCEEDED shoulb już być przetwarzane przez javascript.

Twój kod sprawdził się przy testach z FX 7u40 i 8.0 dev. Widzę kolejny wyjście w dzienniku:

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

który jest dynamicznie załadowanego pola z danymi (129.00) szukałeś.

Może zajść potrzeba aktualizacji JDK do wersji 7u40 lub ponownego przejrzenia algorytmu parsowania logu.

0

Wygląda na to, że chcesz renderować DOM z dynamicznej strony po zakończeniu Javascript na stronie, modyfikując oryginalny HTML. Nie byłoby to łatwe w Javie, ponieważ trzeba by zaimplementować funkcjonalność podobną do przeglądarki z wbudowanym silnikiem JavaScript. Jeśli zależy ci tylko na czytaniu strony internetowej z Javy, możesz zajrzeć do Selenium, ponieważ przejmuje ona kontrolę nad przeglądarką i umożliwia przeciągnięcie renderowanego kodu HTML do Javy.

Odpowiedź ta może również pomóc:

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

+0

Dzięki! Czytam teraz dokumentację selenu, mam nadzieję, że to pomaga. Tak naprawdę nie muszę renderować strony, potrzebuję tylko przetworzonego html jako danych wejściowych do dalszego analizowania. – rivf

Powiązane problemy