Jsoup non sta scaricando l’intera pagina

La pagina Web è: http://www.hkex.com.hk/eng/market/sec_tradinfo/stockcode/eisdeqty_pf.htm

Voglio estrarre tutti gli elementi

usando Jsoup.

Il codice che sto usando è:

 Document doc = Jsoup.connect(url).get(); Elements es = doc.getElementsByClass("tr_normal"); System.out.println(es.size()); 

Ma la dimensione ( 1350 ) è inferiore a quella effettiva ( 1452 ). Ho copiato questa pagina sul mio computer e cancellato alcuni elementi

. Quindi ho eseguito lo stesso codice ed è corretto. Sembra che ci siano troppi elementi, quindi jsoup non può leggerli tutti?

Quindi cosa è successo? Grazie!

Il problema è la gestione della connessione Http Jsoup interna. Niente di male con il motore del selettore. Non sono andato in profondità ma c’è sempre un problema con il modo proprietario di gestire la connessione http. Consiglierei di sostituirlo con HttpClient – http://hc.apache.org/ . Se non puoi aggiungere client http come dipendenze, potresti voler controllare il codice sorgente Jsoup nella gestione della connessione http. Il problema è il valore predefinito maxBodySize di Jsoup.Connection. Si prega di fare riferimento alla risposta aggiornata. * Continuo a mantenere il codice HttpClient come campione. Uscita del programma

  • caricare dal file = 1452
  • carica da client http = 1452
  • carica da jsoup connect = 1350
  • caricare da jsoup connect utilizzando maxBodySize = 1452

     package test; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class TestJsoup { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { Document doc = Jsoup.parse(loadContentFromClasspath(), "UTF8", ""); Elements es = doc.getElementsByClass("tr_normal"); System.out.println("load from file= " + es.size()); doc = Jsoup.parse(loadContentByHttpClient(), "UTF8", ""); es = doc.getElementsByClass("tr_normal"); System.out.println("load from http client= " + es.size()); String url = "http://www.hkex.com.hk/eng/market/sec_tradinfo" + "/stockcode/eisdeqty_pf.htm"; doc = Jsoup.connect(url).get(); es = doc.getElementsByClass("tr_normal"); System.out.println("load from jsoup connect= " + es.size()); int maxBodySize = 2048000;//2MB (default is 1MB) 0 for unlimited size doc = Jsoup.connect(url).maxBodySize(maxBodySize).get(); es = doc.getElementsByClass("tr_normal"); System.out.println("load from jsoup connect using maxBodySize= " + es.size()); } public static InputStream loadContentByHttpClient() throws ClientProtocolException, IOException { String url = "http://www.hkex.com.hk/eng/market/sec_tradinfo" + "/stockcode/eisdeqty_pf.htm"; HttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); return response.getEntity().getContent(); } public static InputStream loadContentFromClasspath() throws ClientProtocolException, IOException { return TestJsoup.class.getClassLoader().getResourceAsStream( "eisdeqty_pf.htm"); } }