【问题标题】:JSoup will not fetch all items?JSoup 不会获取所有项目?
【发布时间】:2013-12-05 01:20:56
【问题描述】:

所以,我正在尝试使用 JSoup 解析一个简单的列表。不幸的是,该程序只返回列表中以 N 开头的条目为止的条目。我不知道为什么会这样。这是我的代码:

    public ArrayList<String> initializeMangaNameList(){
        Document doc;
        try {
            doc = Jsoup.connect("http://www.mangahere.com/mangalist/").get();
            Elements items = doc.getElementsByClass("manga_info");
            ArrayList<String> names = new ArrayList<String>();
            for(Element item: items){
                names.add(item.text());
            }
            return names;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
}

那么为什么列表不包含所有条目?网页有错误吗?或者也许是解析器?我可以使用解决方法绕过此问题吗?首先是什么导致了这个问题?

【问题讨论】:

  • 刚刚用 jsoup-1.6.1 测试了你的代码,它返回了 11906 个结果,这是正确的。
  • JSoup 1.7.2 仅返回 7031 个结果。
  • BINGO 发现问题:1.72 更新日志向 Jsoup.Connection 添加了最大正文响应大小,以防止尝试读取超大文档时内存不足。默认为 1MB。
  • @Skylion 您应该回答您的问题并将其标记为已关闭。不要只是将其留在 cmets 中。这是一个非常有趣的案例,肯定会对其他人有所帮助。

标签: java html list parsing jsoup


【解决方案1】:

好的,该问题是由 JSoup 1.72 及更高版本的更改引起的。您只需要像这样更改默认设置:

public ArrayList<String> initializeMangaNameList(){
    Document doc;
    try {
        doc = Jsoup.connect("http://www.mangahere.com/mangalist/").maxBodySize(0).get();
        Elements items = doc.getElementsByClass("manga_info");
        ArrayList<String> names = new ArrayList<String>();
        for(Element item: items){
            names.add(item.text());
        }
        return names;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

重要的区别是将 maxBodySize 设置为 0,以便它允许无限大小的文件。更多信息可以在documentation 中找到。 这将允许您拥有无限的体型并加载您需要的所有数据。

【讨论】:

  • 这个应该在jsoup的主文档中提到。谢谢。
  • 你拯救了我的一天
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多