2016-07-03 5 views
-1

私は、グローバル通貨ペアに関する履歴データを収集する必要がある小さなプロジェクトを開始しました。この質問Extract Data out of table with JSoupからの答えに続いて、私は以下のコードを貼り付けました。JSoup - テーブルデータの抽出エラー

しかし、 'data' Elements配列のサイズは7ですが、私はIndexOutOfBoundExceptionを受け取りますか?

私は頭を一時間ほど掻き回してきました。誰かが間違っている箇所を指摘できるかどうか分かりました。

メインクラス

import java.util.ArrayList; 
import java.util.List; 
import java.io.IOException; 

import org.jsoup.*; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 


public class MainClass { 


public static void main(String[] args) throws IOException{ 

    Document doc = Jsoup.connect("http://www.myfxbook.com/forex-market/currencies/GBPUSD-historical-data").get(); 

    Element table = doc.getElementById("symbolMarket"); 

    List<Entry> entries = new ArrayList<Entry>(); 

    for(Element row : table.select("tr")){ 

     int index = 0; 
     Entry tableEntry = new Entry(); 
     Elements data = row.select("td"); 

     tableEntry.setDate(data.get(index++).text()); 
     tableEntry.setOpen(data.get(index++).text()); 
     tableEntry.setHigh(data.get(index++).text()); 
     tableEntry.setLow(data.get(index++).text()); 
     tableEntry.setClose(data.get(index++).text()); 
     tableEntry.setChangePips(data.get(index++).text()); 
     tableEntry.setChangePercent(data.get(index++).text()); 

     entries.add(tableEntry); 

    } 

} 

} 

エントリークラス

public class Entry { 

private String date; 
private String open; 
private String high; 
private String low; 
private String close; 
private String changePips; 
private String changePercent; 

public String getDate() { 
    return date; 
} 
public void setDate(String date) { 
    this.date = date; 
} 
public String getOpen() { 
    return open; 
} 
public void setOpen(String open) { 
    this.open = open; 
} 
public String getHigh() { 
    return high; 
} 
public void setHigh(String high) { 
    this.high = high; 
} 
public String getLow() { 
    return low; 
} 
public void setLow(String low) { 
    this.low = low; 
} 
public String getClose() { 
    return close; 
} 
public void setClose(String close) { 
    this.close = close; 
} 
public String getChangePips() { 
    return changePips; 
} 
public void setChangePips(String changePips) { 
    this.changePips = changePips; 
} 
public String getChangePercent() { 
    return changePercent; 
} 
public void setChangePercent(String changePercent) { 
    this.changePercent = changePercent; 
} 



} 

答えて

1

...あなたに任意のアクションを適用する前に、手動でもtdを格納dataの大きさをテストすることができ

for(Element row : table.select("tr:has(td)")){ 
    //       ^^^^^^^^ 
    ... 
} 

子要素としてtdそれをスキップする必要があります。

public static void main(String[] args) throws IOException { 
     Document doc = Jsoup.connect("http://www.myfxbook.com/forex-market/currencies/GBPUSD-historical-data").get(); 

     Element table = doc.getElementById("symbolMarket"); 

     List<Entry> entries = new ArrayList<Entry>(); 

     Elements elements = table.select("tr"); 
     Iterator<Element> itr = elements.iterator(); 
     itr.next(); //skip header data 

     while (itr.hasNext()) { 
      int index = 0; 
      Entry tableEntry = new Entry(); 
      Elements data = itr.next().select("td"); 

      tableEntry.setDate(data.get(index++).text()); 
      tableEntry.setOpen(data.get(index++).text()); 
      tableEntry.setHigh(data.get(index++).text()); 
      tableEntry.setLow(data.get(index++).text()); 
      tableEntry.setClose(data.get(index++).text()); 
      tableEntry.setChangePips(data.get(index++).text()); 
      tableEntry.setChangePercent(data.get(index++).text()); 
      entries.add(tableEntry); 

     }  




    } 
0

'データ' の要素配列のサイズが7であるが、しかし私は、IndexOutOfBoundExceptionを受信し続けますか?

これが当てはまる場合、この例外は表示されません。

問題は、最初の行がどのtd持っていますが、th(表ヘッダ)、この行のrow.select("td")tdセレクタに一致する0の要素を持っているので、あなたは例外からの情報によりそれを知らされていないということである

java.lang.IndexOutOfBoundsException:インデックス:0、サイズ:0

この問題を解決するには、あなたは、単に最初の行を無視する、または明示的に選択することができtrhas少なくとも一つあなたはそれあなたがテーブルヘッダからデータを取得しようとしている

for(Element row : table.select("tr")){ 
    Elements data = row.select("td"); 

    if(data.size()==7){ 

     int index = 0; 
     Entry tableEntry = new Entry(); 

     tableEntry.setDate(data.get(index++).text()); 
     tableEntry.setOpen(data.get(index++).text()); 
     tableEntry.setHigh(data.get(index++).text()); 
     tableEntry.setLow(data.get(index++).text()); 
     tableEntry.setClose(data.get(index++).text()); 
     tableEntry.setChangePips(data.get(index++).text()); 
     tableEntry.setChangePercent(data.get(index++).text()); 

     entries.add(tableEntry); 
    } 
} 
関連する問題