Получение нескольких таблиц из HTML с помощью Jsoup

#java #html #jsoup

#java #HTML #jsoup

Вопрос:

Я пытаюсь очистить данные из нескольких таблиц на этом веб-сайте:http://www.national-autograss.co.uk/march.htm

Мне нужно сохранить данные таблицы вместе с их соответствующими датами, расположенными в h2, поэтому я хотел бы найти способ сделать следующее:

  • Найдите заголовок первой даты h2
  • Извлеките данные таблицы из раздела h2 (может быть несколько таблиц)
  • Переходите к следующему заголовку и извлекайте таблицы и т. Д

Я написал код для извлечения всех частей по отдельности, но я не знаю, как извлечь данные так, чтобы они оставались с соответствующим заголовком даты.

Любая помощь или руководство были бы высоко оценены. Код, с которого я начинаю, приведен ниже, но, как я уже сказал, все, что он делает, — это перебирает данные.

 import java.io.IOException;

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


public class Main {

public static void main(String[] args) {

        Document doc = null;
        try {
            doc = Jsoup.connect("http://www.national-autograss.co.uk/march.htm").get();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Elements elementsTable1 = doc.select("#table1"); 
        Elements elementsTable2 = doc.select("#table2");
        Elements dateElements = doc.select("h2");

        for (int i = 0; i < dateElements.size(); i  ) {
            System.out.println(dateElements.get(i).text());
            System.out.println(elementsTable1.get(i).text());
            System.out.println(elementsTable2.get(i).text());

        }

}
}
  

Комментарии:

1. На вашем месте я бы создал класс, содержащий необходимые переменные. Затем создайте список с экземплярами этого класса, который позже можно будет использовать 🙂

2. Я понимаю логику этого, но моя проблема в том, что все таблицы в исходном коде html помечены либо как table1, либо как table2. Как бы я получил заголовок fitrst date, а затем только таблицы под этим заголовком, т. Е. не получая таблицы из дальнейшего документа и т.д.

3. Ах! Вместо этого я опубликовал в качестве ответа, поскольку мой ответ был слишком длинным для комментария.

Ответ №1:

Кажется, что значения, которые вы хотите, хранятся внутри <tr> ‘s в таблице, где в каждой таблице первым дочерним элементом является <h2> .

 <table align="center"><col width="200"><col width="150"><col width="100"><col width="120"><col width="330"><col width="300">
        <h2>Sunday 30 March</h2>
        <tr id="table1">
            <td><b>Club</b></td>
            <td><b>Venue</b></td>
            <td><b>Start Time</b></td>
            <td><b>Meeting Type</b></td>
            <td><b>Number of Days for Meeting</b></td>
            <td><b>Notes</b></td>

        </tr>
        <tr id="table2">
            <td>Evesham</td>
            <td>Dodwell</td>
            <td>11:00am</td>
            <td>RO</td>
            <td>Single Days Racing</td>
            <td></td>
        </tr>
</table>
  

Мое предложение заключается в том, что вы выполняете поиск по всем таблицам, когда первым дочерним элементом является h2 , вы делаете что-то с остальными его дочерними элементами:

 Elements tables = doc.select("table");
for(Element table : tables) {
    if(table.child(0).tagName().equals("h2")) {
        Elements children = table.children()
    }
}
  

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Вы хотите удалить все <col> перед <h2> , поскольку они будут отображаться перед ним (раньше этого не замечал):

 for(Element element : doc.select("col"))
{
    element.remove();
}
  

Комментарии:

1. Большое спасибо. Начинаю понимать, где я хочу быть с этим прямо сейчас!