Как получить несколько таблиц с помощью JSoup с веб-сайта - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужно получить все 9 столов:

https://www.basketball -reference.com / Players / C / Collijo01.html

Мой текущий код только делает1 стол.Я переключаю .first () на .last (), который не работает.Я попытался использовать ("table.totals") для захвата таблицы по имени, но это также не удалось.

public static void getData(String url) throws IOException
{
    String fileName = "table.csv";
    FileWriter writer = new FileWriter(fileName);
    Document doc = Jsoup.connect(url).get();
    Element tableElement = doc.select("table").first();

    System.out.println(doc);

    Elements tableHeaderEles = tableElement.select("thead tr th");
    for (int i = 0; i < tableHeaderEles.size(); i++) {
        writer.append(tableHeaderEles.get(i).text());

        if(i != tableHeaderEles.size() -1){             
            writer.append(',');
        }
    }
    writer.append('\n');
    System.out.println();

    Elements tableRowElements = tableElement.select(":not(thead) tr");

    for (int i = 0; i < tableRowElements.size(); i++) {
        Element row = tableRowElements.get(i);
        Elements rowItems = row.select("td");
        for (int j = 0; j < rowItems.size(); j++) {
            writer.append(rowItems.get(j).text());

            if(j != rowItems.size() -1){
                writer.append(',');
            }
        }
        writer.append('\n');
    }

    writer.close();
}

Я отлично получаю первую таблицу с сайта, но не могу пройти дальше.Кто-нибудь знает, как получить все таблицы или таблицы захвата на основе идентификатора?

РЕДАКТИРОВАТЬ: если кто-то хочет полностью проверить выходные данные этого кодирования для себя

 public static void read(String file) throws IOException
 {
    Scanner scanner = new Scanner(new File(file));
    scanner.useDelimiter(",");
    while(scanner.hasNext()){
        System.out.print(scanner.next()+"|");
    }
    scanner.close();
}

1 Ответ

0 голосов
/ 19 февраля 2019

Вы уже выбрали все таблицы, но явно получаете только первую:

Element tableElement = doc.select("table").first();

Вместо этого вы можете легко перебрать все из них:

Elements tableElements = doc.select("table");
for (Element tableElement : tableElements) {
   // for each of selected tables
}

после некоторых модификаций для получения уникального имени файла код будет выглядеть следующим образом:


public static void getData(String url) throws IOException {
    String html = Jsoup.connect(url).execute().body();
    // this one is tricky as it contains tables as commented out HTML, and shows them using javascript code
    // so I'm using dirty replace to remove comment tags before parsing to make tables visible to Jsoup
    html = html.replaceAll("<!--", "");
    html = html.replaceAll("-->", "");
    Document doc = Jsoup.parse(html);
    Elements tableElements = doc.select("table");
    int number = 1;
    for (Element tableElement : tableElements) {
        String tableId = tableElement.id();
        if (tableId.isEmpty()) {
            // skip table without id
            continue;
        }
        tableId = " with id " + tableId;
        String fileName = "table" + number++ + tableId + ".csv";
        FileWriter writer = new FileWriter(fileName);

        System.out.println(doc);

        Elements tableHeaderEles = tableElement.select("thead tr th");
        for (int i = 0; i < tableHeaderEles.size(); i++) {
            writer.append(tableHeaderEles.get(i).text());

            if (i != tableHeaderEles.size() - 1) {
                writer.append(',');
            }
        }
        writer.append('\n');
        System.out.println();

        Elements tableRowElements = tableElement.select(":not(thead) tr");

        for (int i = 0; i < tableRowElements.size(); i++) {
            Element row = tableRowElements.get(i);
            Elements rowItems = row.select("td");
            for (int j = 0; j < rowItems.size(); j++) {
                writer.append(rowItems.get(j).text());

                if (j != rowItems.size() - 1) {
                    writer.append(',');
                }
            }
            writer.append('\n');
        }

        writer.close();
    }
}

Ответ на ваш второй вопрос:

захват таблиц на основе идентификатора

Вместо выбора первой таблицы всех таблиц:

Element tableElement = doc.select("table").first();

выберите первую таблицу таблицы с идентификатором advanced:

Element tableElement = doc.select("table#advanced").first();

Дополнительный совет: вещи, которые вы задаете в качестве параметров select(...) являются CSS-селекторами .

...