Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

HTML Class-Attribute auslesen & vereinzelnd listen

Forumthread: 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>


    Anzeige

    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
    ;
    Anzeige
    Anzeige

    Infobox / Tutorial

    HTML Class-Attribute auslesen und vereinzelnd listen


    Schritt-für-Schritt-Anleitung

    Um HTML Class-Attribute mit VBA auszulesen und die Werte vereinzelnd in Zellen anzuzeigen, kannst Du die folgenden Schritte befolgen:

    1. Öffne Excel und erstelle ein neues Arbeitsblatt.

    2. Aktiviere die Entwicklertools in Excel, wenn sie noch nicht aktiviert sind.

    3. Öffne den VBA-Editor mit ALT + F11.

    4. Erstelle ein neues Modul über Einfügen > Modul.

    5. Füge den folgenden Code in das Modul ein:

      Dim browser As Object
      Set browser = CreateObject("InternetExplorer.Application")
      browser.Visible = True
      browser.Navigate "www.beispiel.de/sport/laufen.php"
      
      Do While browser.Busy Or browser.readyState <> 4
         DoEvents
      Loop
      
      Dim knotenWurzel As Object
      Set knotenWurzel = browser.document.getElementsByClassName("upper-words")(0)
      
      If Not knotenWurzel Is Nothing Then
         Dim knotenStamm As Object
         Set knotenStamm = knotenWurzel.getElementsByTagName("a")
         Dim spalteAktuellesWort As Integer
         spalteAktuellesWort = 2
      
         For Each knotenAst In knotenStamm
             Cells(1, spalteAktuellesWort).Value = knotenAst.innerText
             spalteAktuellesWort = spalteAktuellesWort + 1
         Next knotenAst
      End If
    6. Passe die URL und den Class-Namen entsprechend Deiner Bedürfnisse an.

    7. Führe das Makro aus, um die Daten zu laden.


    Häufige Fehler und Lösungen

    • Fehler: "Object variable or With block variable not set"

      • Lösung: Stelle sicher, dass der angegebene Class-Name korrekt ist und dass die Webseite vollständig geladen ist, bevor Du den Code ausführst.
    • Fehler: Alle Werte werden in die gleiche Zelle geschrieben

      • Lösung: Überprüfe, ob Du spalteAktuellesWort = spalteAktuellesWort + 1 innerhalb der Schleife hinzugefügt hast. Dies ist notwendig, um die Werte in verschiedene Zellen zu schreiben.

    Alternative Methoden

    Wenn Du nicht mit VBA arbeiten möchtest, kannst Du auch andere Tools oder Programmiersprachen wie Python mit der Bibliothek BeautifulSoup verwenden, um HTML auszulesen. Eine andere Möglichkeit ist die Verwendung von Excel Power Query, um Daten aus Webseiten zu importieren, jedoch ist diese Methode nicht so flexibel wie VBA für spezifische Class-Attribute.


    Praktische Beispiele

    Hier sind einige praktische Beispiele, wie Du HTML Class-Attribute auslesen kannst:

    1. Einzelnes Class-Attribut in einer Zelle:

      Set knotenWurzel = browser.document.getElementsByClassName("upper-words")(0)
      Cells(1, 2).Value = knotenWurzel.innerText
    2. Vereinzelnd in mehrere Zellen:

      Dim spalteAktuellesWort As Integer
      spalteAktuellesWort = 2
      For Each knotenAst In knotenStamm
         Cells(1, spalteAktuellesWort).Value = knotenAst.innerText
         spalteAktuellesWort = spalteAktuellesWort + 1
      Next knotenAst

    Tipps für Profis

    • Nutze Option Explicit am Anfang Deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind.
    • Verwende Fehlerbehandlung in Deinem VBA-Code, um potenzielle Laufzeitfehler zu vermeiden.
    • Experimentiere mit verschiedenen Class-Namen und Tags, um mehr Informationen aus der HTML-Struktur zu extrahieren.
    • Dokumentiere Deinen Code, um die Lesbarkeit und Wartbarkeit zu erhöhen.

    FAQ: Häufige Fragen

    1. Wie kann ich mehrere Class-Attribute auslesen?
    Du kannst mehrere getElementsByClassName Aufrufe nutzen oder die Schleife so anpassen, dass sie auf verschiedene Class-Namen zugreift.

    2. Ist dieser Prozess auch für andere Webseiten geeignet?
    Ja, solange die Webseite im richtigen Format vorliegt und Du die entsprechenden Class-Namen kennst, kannst Du diese Methode universell anwenden.

    3. Funktioniert das auch in Excel 365?
    Ja, die gezeigten Methoden sind in Excel 365 und anderen modernen Versionen von Excel anwendbar.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige