【问题标题】:Jsoup not downloading entire pageJsoup没有下载整个页面
【发布时间】:2014-06-20 21:31:52
【问题描述】:

网页是:http://www.hkex.com.hk/eng/market/sec_tradinfo/stockcode/eisdeqty_pf.htm

我想使用 Jsoup 提取所有 <tr class="tr_normal"> 元素。

我使用的代码是:

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

但尺寸 (1350) 比实际尺寸 (1452) 小。 我将此页面复制到我的计算机上并删除了一些<tr> 元素。然后我运行了相同的代码,它是正确的。貌似元素太多,jsoup 无法全部读取?

那么发生了什么?谢谢!

【问题讨论】:

    标签: java html http web jsoup


    【解决方案1】:

    问题在于内部 Jsoup Http 连接处理。 选择器引擎没有问题。 我没有深入研究,但处理 http 连接的专有方式总是存在问题。我建议将其替换为 HttpClient - http://hc.apache.org/ 。如果您无法将 http 客户端添加为依赖项,您可能需要检查 Jsoup 源代码以处理 http 连接。 问题是 Jsoup.Connection 的默认 maxBodySize。请参阅更新的答案。 *我仍然保留 HttpClient 代码作为示例。 程序的输出

    • 从文件加载= 1452
    • 从 http 客户端加载 = 1452
    • 从 jsoup 加载连接 = 1350
    • 使用 maxBodySize= 1452 从 jsoup 连接加载

      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");
          }
      
      }
      

    【讨论】:

    • 好吧,我知道该怎么做了。但我还是想知道,这是jsoup的bug吗?
    • 我认为这是问题所在。默认最大大小为 1MB。你的大小是 1MB++。您可以使用 doc = Jsoup.connect(url).maxBodySize(1200000).get();
    • 请参考更新后的答案。我只是检查了 Jsoup 源代码并发现了设置。根据调查结果,我还发现了类似的 stackoverflow 问题 - stackoverflow.com/questions/20106284/…。如果我们可以将此通知 Jsoup 的团队并添加到 Jsoup 文档中,这可能对其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多