2013-11-20 79 views
7

所以,我試圖用JSoup解析一個簡單的列表。不幸的是,該程序只會返回條目直到列表中以N開頭的條目。我不知道爲什麼會這樣。這是我的代碼:JSoup不會獲取所有項目?

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

那麼爲什麼列表不包含所有的條目?網頁有錯誤嗎?或者也許解析器?我可以使用解決方法繞過此問題嗎?首先是什麼導致了這個問題?

+0

剛剛用jsoup-1.6.1測試了你的代碼,它返回了11906個結果,這是正確的。 – melc

+0

JSoup 1.7.2只返回7031個結果。 – Skylion

+0

賓果發現問題:1.72更新日誌爲Jsoup.Connection添加最大主體響應大小,以防止嘗試讀取超大文檔時內存不足。默認值是1MB。 – Skylion

回答

18

好的,這個問題是由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中找到。 這將允許您有無限的身體大小和加載所需的所有數據。

+0

太好了。 Upvoted問題和答案。它會派上用場。 – alkis

+0

這應該在jsoup的主要文檔中提及。謝謝。 – appl3r