2013-11-20 15 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

BINGO問題を見つけました:1.72 changelog非常に大きな文書 を読み込もうとするとメモリが足りなくなるのを防ぐため、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; 

}

それは無制限のサイズのファイルを許可するように重要な差が0にmaxBodySizeを設定しています。詳細はdocumentationをご覧ください。 これにより、ボディサイズを無制限にして、必要なすべてのデータを読み込むことができます。

+0

Upvoted質問と回答。それは便利です。 – alkis

+0

これはjsoupのメイン文書に記載されています。ありがとう。 – appl3r

関連する問題