Java Jsoup未下载整个页面
网页为: 我想使用Jsoup提取所有Java Jsoup未下载整个页面,java,html,http,web,jsoup,Java,Html,Http,Web,Jsoup,网页为: 我想使用Jsoup提取所有元素 我使用的代码是: Document doc = Jsoup.connect(url).get(); Elements es = doc.getElementsByClass("tr_normal"); System.out.println(es.size()); 但是大小(1350)比实际大小(1452)小。 我将此页面复制到我的计算机上,并删除了一些元素。然后我运行了相同的代码,它是正确的。看起来元素太多了,所以jsoup无法读取所有元素 发生了什么
元素
我使用的代码是:
Document doc = Jsoup.connect(url).get();
Elements es = doc.getElementsByClass("tr_normal");
System.out.println(es.size());
但是大小(1350)比实际大小(1452)小。
我将此页面复制到我的计算机上,并删除了一些
元素。然后我运行了相同的代码,它是正确的。看起来元素太多了,所以jsoup无法读取所有元素
发生了什么事?谢谢 问题在于内部Jsoup Http连接处理。选择引擎没有问题。我并没有深入讨论,但处理http连接的专有方法总是存在问题。我建议将其替换为HttpClient-。如果无法将http客户端添加为依赖项,则可能需要在处理http连接时检查Jsoup源代码。
问题是Jsoup.Connection的默认maxBodySize。请参阅更新的答案*我仍然保留HttpClient代码作为示例。 程序的输出
- 从文件加载=1452
- 从http客户端加载=1452
- 从jsoup connect加载=1350
- 使用maxBodySize=1452从jsoup connect加载
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"); } }