AW: HTML Class-Attribute auslesen & vereinzelnd listen
20.06.2019 14:14:14
Zwenn
Hallo Anton,
grundsätzlich ist es immer am Besten, wenn immer die richtige Seite verlinkt wird. Anhand Deines Beispiel-HTML-Codes funktioniert es folgendermaßen.
Alle Wörter des ersten HTML-Abschnitts mit dem CSS-Klassenamen upper-words in Zelle B1:
Set knotenWurzel = browser.document.getElementsByClassName("upper-words")(0)
If Not knotenWurzel Is Nothing Then
Cells(1,2).Value = knotenWurzel.innerText
End If
Beliebig viele Wörter des ersten HTML-Abschnitts mit dem CSS-Klassenamen upper-words vereinzelt in die Zellen B1, C1, D1, usw.:
spalteAktuellesWort = 2
Set knotenWurzel = browser.document.getElementsByClassName("upper-words")(0)
If Not knotenWurzel Is Nothing Then
Set knotenStamm = knotenWurzel.getElementsByTagName("a")
If Not knotenStamm Is Nothing Then
For Each knotenAst in KnotenStamm
Cells(1,spalteAktuellesWort).Value = knotenAst.innerText
Next knotenAst
End If
End If
Ich nehme an, wie die Get-Methoden grundsätzlich funktionieren hast Du verstanden. Der entscheidende Unterschied meiner beiden Beispiele ist, dass beim Bilden der NodeCollection auf Basis des CSS-Klassennamens upper-words direkt nur das erste Element in der NodeCollection gespeichert wird. Genau genommen gibt es also keine NodeCollection, sondern das DOM-Objekt knotenWurzel enthält ausschließlich den ersten HTML-Abschnitt mit dem CSS-Klassennamen.
Das es nur das erste Element ist, wird über den nachgestellten Klammerausdruck (0) festgelegt. Würde man schreiben (1), würde das zweite Element mit dem entsprechenden Klassennamen zum DOM-Objekt, usw. Wieviele Elemente eine NodeCollection hat, steht in der Eigenschaft Length. Die NodeCollection selbst ist Null-basiert, während Length die Anzahl angibt. Wenn man mit Length arbeitet, muss man also immer 1 abziehen.
Im zweiten Beispiel werden alle a-Tags in der NodeCollection knotenStamm versammelt. Das alle HTML-Abschnitte enthalten sind, wird über das Weglassen des nachgestellten Klammerausdrucks erreicht. Um nun auf jedes der Elmente zuzugreifen bietet sich die For-Each-Schleife an.
Allerdings hast Du auch hier die Möglichkeit über die Indizes der NodeCollection auf einzelne Elemente zuzugreifen. Z.B. möchtest Du das letzte Wort, weißt aber nicht, wieviele Wörter es sind. Dafür nochmal als Anschauliches Beispiel die Verwendung von Length:
spalteAktuellesWort = 2
Set knotenWurzel = browser.document.getElementsByClassName("upper-words")(0)
If Not knotenWurzel Is Nothing Then
Set knotenStamm = knotenWurzel.getElementsByTagName("a")
If Not knotenStamm Is Nothing Then
'Wir wollen nur das letzte Wort der NodeCollection
anzahlElmenteNodeCollection = knotenStamm.Length
'Ausgabe des letzten Elements der NodeCollection mit Korrektur für den Index
Cells(1,spalteAktuellesWort).Value = knotenStamm(anzahlElmenteNodeCollection - 1).innerText
End If
End If
Ich habe das zur Veranschaulichung mal aufgedröselt. Man kann aber natürlich auch in einer Zeile schreiben:
Cells(1,spalteAktuellesWort).Value = knotenStamm(knotenStamm.Length - 1).innerText
Ich habe den Code nicht ausprobiert, sondern nur hier reingetippt. Aber es sollte reichen, um Dich ein Stück weiter zu bringen denke ich.
Die Variablennamen für DOM-Objekte haben bei mir immer knoten im Namen. Im allgemeinen verwende ich dann Wörter, die immer kleiner werdende Bestandteile eines Baumes bezeichnen. knotenWurzel, knotenStamm, knotenAst, knotenZweig, knotenBlatt. Das habe ich mir angewöhnt, weil es sich bei der Abbildung einer Seite nach dem Document Object Model um einen Baum handelt. Das nur zur Erklärung, weil ich diese Namen inzwischen in vielen veröffentlichten Codes verwendet habe.
Viele Grüße,
Zwenn