Jsoup只发现〜9000 <a> tags in the document</a>的一半

时间:2013-09-02 12:59:20

标签: java jsoup

我正在使用JSoup从HTML页面解析一堆XML链接。我连接到该页面,并为所有anchor标签解析它,如下所示:

 Document htmlDoc = null;
    location = location.replace("\\", "/").replace("http:/", "http://") + "/";
    try {
        htmlDoc = Jsoup.connect(location).get();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return htmlDoc.select("a");

它正在查找页面,并加载了一半<a>标签,这些标签包含指向xml文档的链接。但出于某种原因,它的停止只有不到一半。当我使用IntelliJ并尝试查看列表中的最后一个xml链接时,我看到了:

enter image description here

但是,突出显示的<a>标记显示在页面的一半下方,这意味着它只检索了大约一半的所需标记。值得注意的是,这个HTML页面很大,我期待返回大约9,000个<a>个标签。目前我正在4383

这是JSoup的常见问题吗?是否有某种超时或内存上限?

修改

所以,我提取了我的程序从服务器上拉下来的纯HTML代码,这就是我所看到的:

    <td valign="top"><img src="/icons/text.gif" alt="[TXT]" /></td>
     <td><a href="IEHRES30J8M4_1378047310463.xml">IEHRES30J8M4_1378047310463.xml</a></td>
       <td align="right">01-Sep-2013 15:55 </td>
     </tr>
    </tbody>
   </table>
  </body>
</html>

现在,这显示了所有必要的结束标记。它不只是停止标签的一半。如果内存不足,JSoup会整理HTML,或者它认为这是网页的整个内容?

进一步发行

我在maxBodySize对象中找到了一个名为Jsoup.Connection的方法。我将maxBodySize设置为1048576 (10MB)。正在检索的文件大小为4MB,但这仍然无法解决问题。这是修改后的代码:

 Document htmlDoc = null;
    location = location.replace("\\", "/").replace("http:/", "http://") + "/";
    try {
        logger.info("Parsing XML Files from " + location);
        Connection conn = Jsoup.connect(location);
        conn.maxBodySize(1048576);
        htmlDoc = conn.get();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return htmlDoc.select("a");

2 个答案:

答案 0 :(得分:3)

经过进一步检查后,我发现我的网页以两个增量加载。我想这是因为数据量庞大。我的jSoup <a>代码数组中的最后一个条目对应于页面第一个增量上的最后一个<a>

我通过使用此方法单独拉下HTML来解决这个问题:

private static String getHtml(String location) throws IOException {
    URL url = new URL(location);
    URLConnection conn = url.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String input;
    StringBuilder builder = new StringBuilder();
    while((input = in.readLine()) != null)
    {
         builder.append(input);
    }

    return builder.toString();
}

然后在结果字符串上调用Jsoup.parse方法。这意味着我拥有所有数据,它实际上提高了性能(虽然对于我的生活我不知道如何)。

答案 1 :(得分:1)

我用包含超过50.000(五万)的生成的HTML文件测试了jsoup 锚标签。

Jsoup完全解析了这些文件,并能够选择所有锚元素 和href属性正确...

因此,没有根本的问题。