2013-08-03 11 views
7

Ho bisogno di analizzare la pagina, tutto è ok tranne alcuni elementi nella pagina caricati dinamicamente. Ho usato jsoup per elementi statici, poi quando ho capito che avevo davvero bisogno di elementi dinamici, ho provato javafx. Ho letto molte risposte su StackOverflow e c'erano molti consigli per utilizzare javafx WebEngine. Così ho finito con questo codice.Come ottenere html della pagina completamente caricata (con javascript) come input in 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(); 
} 

Ho creato una stringa da org.w3c.dom.Document e l'ho stampata. Ma era anche inutile. primaryStage.show() mi ha mostrato la pagina completamente caricata (con l'elemento che ho bisogno di render sulla pagina), ma non c'era alcun elemento che mi servisse nel codice html (in output).

Questo è il terzo giorno in cui sto lavorando a questo problema, ovviamente la mancanza di esperienza è il mio problema principale, tuttavia devo dire: sono bloccato. Questo è il mio primo progetto java dopo aver letto il riferimento completo di java. Lo faccio per avere qualche esperienza del mondo reale (e per divertimento). Voglio fare il parser del cinese "ebay".

qui è il problema ed i miei casi di test:

http://detail.tmall.com/item.htm?spm=a220o.1000855.0.0.PZSbaQ&id=19378327658 necessario per ottenere dinamicamente caricati sconto "129.00"

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

Come si può vedere, se si visualizza queste pagine con il browser in un primo momento vedete il prezzo originale e dopo circa un secondo - sconto.

È persino possibile ottenere questi sconti dinamici dalla pagina html? Altri elementi che devo analizzare sono statici. Cosa provare dopo: un'altra libreria per il rendering di html con javascript o forse con altro ancora? Ho davvero bisogno di un consiglio, non voglio arrendermi.

risposta

1

modello DOM restituito dopo Worker.State.SUCCEEDED shoulb essere già trattati da javascript.

Il tuo codice ha funzionato per me con testati con FX 7u40 e 8.0 dev. Vedo prossima uscita nel registro:

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

cui box viene caricato dinamicamente con i dati (129.00) avete cercato.

È possibile aggiornare il JDK a 7u40 o rivisitare l'algoritmo di analisi del registro.

0

Sembra che tu voglia il DOM renderizzato da una pagina dinamica dopo che il Javascript sulla pagina ha finito di modificare l'HTML originale. Questo non sarebbe facile da fare in Java dato che sarebbe necessario implementare funzionalità simili a browser con un motore JavaScript integrato. Se ti interessa solo leggere una pagina web da Java, potresti voler esaminare Selenium dato che prende il controllo di un browser e ti permette di trascinare l'HTML reso in Java.

Questa risposta potrebbe anche aiutare:

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

+0

Grazie! Sto leggendo la documentazione sul selenio ora, spero che questo aiuti. Inoltre non ho davvero bisogno di renderizzare la pagina, ho bisogno solo di html elaborato come input per un'ulteriore analisi. – rivf

Problemi correlati