Die Selektoren in JSoup weisen Ähnlichkeiten mit den Selektoren in JavaScript auf. Beide haben eine ähnliche Syntax und ermöglichen es Ihnen, Elemente aus einem HTML-Dokument anhand ihres Tag-Namens, ihrer Klasse, ihrer ID und ihrer CSS-Eigenschaften auszuwählen.
Hier sind einige der wichtigsten Selektoren, die Sie mit JSoup verwenden können:
- getElementsByTag(): Wählt Elemente anhand ihres Tag-Namens aus.
- getElementsByClass(): Wählt Elemente anhand ihres Klassennamens aus.
- getElementById(): Wählt ein Element anhand seiner ID aus.
- select(): Wählt Elemente anhand eines CSS-Selektors aus (ähnlich wie querySelectorAll)
Verwenden wir nun einige davon, um alle Teamnamen zu extrahieren:
try {
Document document = Jsoup.connect("https://www.scrapethissite.com/pages/forms/")
.get();
Elements rows = document.getElementsByTag("tr");
for(Element row : rows) {
Elements teamName = row.getElementsByClass("name");
if(teamName.text().compareTo("") != 0)
System.out.println(teamName.text());
}
} catch (IOException e) {
e.printStackTrace();
}
// Prints the team names:
Boston Bruins
Buffalo Sabres
Calgary Flames
Chicago Blackhawks
Detroit Red Wings
Edmonton Oilers
Hartford Whalers
...
Wir haben jede Zeile durchlaufen und für jede den Teamnamen mithilfe des Klassenselektors „name“ ausgegeben.
Das letzte Beispiel verdeutlicht die Flexibilität und die Möglichkeit, Selektormethoden mehrfach auf die extrahierten Elemente anzuwenden. Dies ist besonders nützlich beim Umgang mit komplexen und umfangreichen HTML-Dokumenten.
Hier ist eine weitere Version, die Java-Streams und die select()-Methode verwendet, um alle Teamnamen auszugeben:
try {
Document document = Jsoup.connect("https://www.scrapethissite.com/pages/forms/")
.get();
Elements teamNamesElements = document.select("table .team .name");
String[] teamNames = teamNamesElements.stream()
.map(element -> element.text())
.toArray(String[]::new);
for (String teamName : teamNames) {
System.out.println(teamName);
}
} catch (IOException e) {
e.printStackTrace();
}
// Also prints the team names:
Boston Bruins
Buffalo Sabres
Calgary Flames
...
Nun geben wir alle Tabellenüberschriften und Zeilen aus:
try {
Document document = Jsoup.connect("https://www.scrapethissite.com/pages/forms/")
.get();
Elements tableHeadersElements = document.select("table th");
Elements tableRowsElements = document.select("table .team");
String[] tableHeaders =
tableHeadersElements.stream()
.map(element -> element.text())
.toArray(String[]::new);
String[][] tableRows =
tableRowsElements.stream()
.map(
table_row -> table_row
.select("td")
.stream()
.map(row_element -> row_element.text())
.toArray(String[]::new)
)
.toArray(String[][]::new);
for (int i = 0; i < tableHeaders.length; i++) {
System.out.print(tableHeaders[i] + " ");
}
for (int i = 0; i < tableRows.length; i++) {
for (int j = 0; j < tableRows[i].length; j++) {
System.out.print(tableRows[i][j] + " ");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
// Prints
Team Name Year Wins Losses OT Losses Win ...
Boston Bruins 1990 44 24 0.55 299 264 35
Buffalo Sabres 1990 31 30 0.388 292 278 14
Calgary Flames 1990 46 26 0.575 344 263 81
Chicago Blackhawks 1990 49 23 0.613 284 211 73
Detroit Red Wings 1990 34 38 0.425 273 298 -25
...
Beachten Sie, dass wir Streams verwendet haben, um die Zeilen zu speichern. Hier ist eine einfachere Methode, bei der for-Schleifen zum Einsatz kommen:
String[][] tableRows = new String[tableRowsElements.size()][];
for (int i = 0; i < tableRowsElements.size(); i++) {
Element table_row = tableRowsElements.get(i);
Elements tableDataElements = table_row.select("td");
String[] rowData = new String[tableDataElements.size()];
for (int j = 0; j < tableDataElements.size(); j++) {
Element row_element = tableDataElements.get(j);
String text = row_element.text();
rowData[j] = text;
}
tableRows[i] = rowData;
}