Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1696to1700
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

HTML Class-Attribute auslesen & vereinzelnd listen

HTML Class-Attribute auslesen & vereinzelnd listen
19.06.2019 17:07:48
Anton
Hallo liebe Excel-Freunde,
ich versuche aktuell class-Attribute aus Webseite auszulesen und in die Werte vereinzelnd in Zellen rechts nebeneinander anzuzeigen. Dient ausschließlich für eine eigene private Datenbank.
Habe mir dazu auch einiges durchgelesen:
  • https://www.herber.de/forum/archiv/1592to1596/1593619_GetElementByClass_bzw_ByTagName.html

  • https://www.herber.de/forum/archiv/1576to1580/1577710_Daten_per_VBA_aus_IE_auslesen.html

  • http://www.office-loesung.de/ftopic661856_0_0_asc.php

  • Allerdings finde ich zwar gute Ansätze, aber nicht das Richtige.
    Mein Ziel:
    In Spalte A habe ich mehrere Begriffe. Die werden einzelnd in die URL eingebunden und die HTML wird ausgelesen. Beispielsweise steht in A1 "laufen" und als URL "www.beispiel.de/sport/*laufen*.php".
    Bei der Webseite soll immer nur das erste Class-Attribut "upper-words" ausgelesen werden und die einzelnen Wörter sollen rechts neben der Spalte A erscheinen. Das kann auch ruhig kompakt in nur einer Zelle stehen.
    Das HTML Schema sieht ca. so aus:

    <div class="list-content" id="Group14016">
    <div class="upper-words">
    <i>Bestand</i>
    <a href="#">Halt</a>
    <a href="#">Festigkeit</a>
    <a href="#">Sicherheit</a>
    </div>
    </div>


    3
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    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
    Anzeige
    AW: HTML Class-Attribute auslesen & vereinzelnd listen
    20.06.2019 14:17:56
    Zwenn
    In Beispiel 2 fehlt spalteAktuellesWort = spalteAktuellesWort + 1 vor Next knotenAst. Sonst wird jedes Wort in B1 geschrieben und Du hast dann nur das letzte nachdem das Makro beendet wurde.
    AW: HTML Class-Attribute auslesen & vereinzelnd listen
    20.06.2019 22:13:07
    Anton
    Hallo Zwenn,
    vielen Dank für deine Ausführung. Mit VBA verstehe ich die Codes nur vereinzelnd. Lerne mich noch etwas rein. Die Get-Methoden verstehe allerdings ganz gut - ziehen die Daten aus dem jeweiligen HTML-Element.
    Mit Html- und CSS-Programmierung kenne ich mich im Prinzip gut aus und konnte mit deinem zweiten Code-Beispiel genau das erreichen, was ich wollte.
    Hat mir sehr geholfen!
    Vielen Dank nochmal
    VG Anton
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige