#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. Большое спасибо. Начинаю понимать, где я хочу быть с этим прямо сейчас!