Analisis tabel jsoup Java mengabaikan satu baris atau mengeluarkan indeks di luar batas pengecualian

Saya menemukan masalah kemarin dengan perpustakaan jsoup.

public class Analyse {
    public static void main(String[] args) throws IOException, FileNotFoundException {

        try {
            PrintStream output = new PrintStream(new File("E://eBot1.txt"));
            System.setOut(output);
        }
        catch (FileNotFoundException fx) {
            System.out.println(fx);
        }

        for (int i = 1527; i < 1542; i++) {
            String url = "http://csgolive.eslproseries.de/matchs/view/" + i + "#stats-players";
            Document doc = Jsoup.connect(url).get();
            String MatchID = doc.select("h4").text();
            System.out.println("\n\n" + "Spiel: " + MatchID + "\n\n");
            for (Element table : doc.select("table[id=tablePlayers]")) {
                for (Element row : table.select("tr")) {
                    Elements tds2 = row.select("td:not([rowspan])");
                    int vsTwo = Integer.parseInt(tds2.get(13).text());
                    int vsThree = Integer.parseInt(tds2.get(14).text());
                    int vsFour = Integer.parseInt(tds2.get(15).text());
                    int vsFive = Integer.parseInt(tds2.get(16).text());
                    int fourKills = Integer.parseInt(tds2.get(20).text());
                    int fiveKills = Integer.parseInt(tds2.get(21).text());
                    if (vsTwo > 0) {
                        System.out.println("Team: " + tds2.get(0).text() + " Player: " + tds2.get(1).text() + " 1v2 Clutch: " + tds2.get(13).text());
                    }
                    if (vsThree > 0) {
                        System.out.println("Team: " + tds2.get(0).text() + " Player: " + tds2.get(1).text() + " 1v3 Clutch: " + tds2.get(14).text());
                    }
                    if (vsFour > 0) {
                        System.out.println("Team: " + tds2.get(0).text() + " Player: " + tds2.get(1).text() + " 1v4 Clutch: " + tds2.get(15).text());
                    }
                    if (vsFive > 0) {
                        System.out.println("Team: " + tds2.get(0).text() + " Player: " + tds2.get(1).text() + " 1v5 Clutch: " + tds2.get(16).text());
                    }
                    if (fourKills > 0) {
                        System.out.println("Team: " + tds2.get(0).text() + " Player: " + tds2.get(1).text() + " 4 Kills: " + tds2.get(20).text());
                    }
                    if (fiveKills > 0) {
                        System.out.println("Team: " + tds2.get(0).text() + " Player: " + tds2.get(1).text() + " 5 Kills: " + tds2.get(21).text());
                    }
                    else {
                    }
                }
            }
        }
    }
}

Jadi pada dasarnya, saya ingin menganalisis tabel dari ini (http://csgolive.eslproseries.de/matchs/view/1529#stats-players). Di URL itu, matchID (dalam hal ini 1529) harus ditentukan oleh for-loop. Ini berfungsi dengan baik, begitu pula pernyataan jsoup.connect. Jadi saya mendapat kode html dari website. Sekarang saya ingin memfilter alias dengan tim yang cocok dari tabel. Perintahnya seharusnya

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

Ini, meskipun membuat saya mendapatkan kesalahan berikut:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 13, Size: 0
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at org.jsoup.select.Elements.get(Elements.java:544)
    at org.jsoup.Analyse.main(Analyse.java:42)

Saya sudah mencoba metode untuk menghindari hal ini. Satu-satunya metode yang berhasil adalah dengan menempatkan

for (Element row : table.select("tr:gt(0)"));

Ini hanya memuat entri tabel 2-10, jadi saya selalu melewatkan yang pertama.

Jadi pertanyaan saya adalah: Apakah ada cara agar kesalahan ini tidak terjadi dan tetap mendapatkan semua baris tabel?

EDIT: Saya mengkodekan kemungkinan lain yang mengungkapkan kesalahan sebenarnya: Baris pertama yang diuraikan di tds2.get(13).text() .get(14). dll memberikan IndexOutOfBoundsException. Jadi baris pertama sepertinya kosong. Namun ketika saya mencetaknya ke konsol, semuanya normal.

Terselesaikan:

Diganti

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

Dengan

for (int f = 1; f < 11 ; f++) {

person jojA    schedule 26.02.2015    source sumber


Jawaban (1)


Apakah tabel yang Anda parsing memiliki header? Seolah-olah baris pertama memiliki sel daripada ini akan menjadi perilaku yang diharapkan...

person Emily Crutcher    schedule 26.02.2015
comment
Tabel ini memiliki header dan body. Saya mengkodekan kemungkinan lain yang mengungkapkan kesalahan sebenarnya: Baris pertama yang diuraikan di tds2.get(13).text() .get(14). dll memberikan IndexOutOfBoundsException. Jadi baris pertama sepertinya kosong. Namun ketika saya mencetaknya ke konsol, semuanya normal. - person jojA; 26.02.2015
comment
Anda dapat mencoba mencetak baris tersebut di konsol untuk melihat apa yang terjadi. yaitu mencetak setiap tr dengan kurang dari 15 tds. - person Emily Crutcher; 27.02.2015