Daten aus Tabelle einer Webseite importieren

By , 5. Mai 2011

Der nachfolge Artikel zeigt wie man den Quelltext einer Webseite erhält, mittels DOM Bereiche im Quelltext ermittelt und wie man aus einer HTML-Tabelle Daten auch Formatiert ausliest.

Zuerst also benötigen wir den Seitenquelltext einer bestimmten Webseite. Dazu muss zuerst ein Verweiss auf die Microsoft HTML Object Library gesetzt werden, damit die entsprechenden Objekte und Funktionen zur Verfügung stehen:

1. Objekte deklarieren:

Dim objHTML As New HTMLDocument
Dim objDoc As New HTMLDocument
Dim objBody As HTMLBody

2. Seitenquelltext laden und Body extrahieren:

Set objDoc = objHTML.createDocumentFromUrl("http://yourwebsite.com/table1.htm", vbNullString)
Warten 1
Set objBody = objDoc.body

Es sieht vieleicht etwas merkwürdig aus, 2 gleiche Objekte und dann noch eine Warten-Funktion.
Man denkt sich vieleicht das man doch direkt
Set objBody = objHTML.createDocumentFromUrl(„http://yourwebsite.com/table1.htm“, vbNullString).body
schreiben könnte, aber das haut nicht hin. Der Grund liegt an der Ladezeit wie die Webseite den Seitenquelltext liefert. Dieser muss zuerst komplett geladen sein, bevor davon der Body extrahiert werden kann. Auch die zwei HTMLDocument Objekte sind notwendig, die Zuweisung ins selbe Objekt wäre hier nicht zulässig.

3. Inhalt der Tabelle in eine String-Variable speichern und bearbeiten:

strTableHTML = objBody.all.tags("TBODY")(0).innerHTML
arrHeadline() = split(left(strTableHTML, InStr(1, strTableHTML, "") - 5), "")
strTableHTML = Trim(Right(strTableHTML, Len(strTableHTML) - InStr(1, strTableHTML, "") - 5))
strTableHTML = Trim(Right(strTableHTML, Len(strTableHTML) - InStr(1, strTableHTML, "") - 4))

Dabei bedient man sich wieder den Methoden des DOMs. Wie bekannt sein sollte ist der Seitenquelltext hirachisch in sogenannten Knoten aufgeteilt. in objBody.all findet man alle Tags (Knoten) des Seitenquelltextes. Wie suchen nach dem Index „TBODY“ an der 1. Stelle, also Index 0. Obwohl in der Beispiel-Webseite in der Tabelle kein TBODY-Tag steht, ist er jedoch im DOM vorhanden. Das DOM bildet den Seitenquelltext also nicht genau so ab wie er in einem Text-Editor erscheint, sondern ist standardisiert.
Die 2 nachfolgenden Zeilen entfernen aus dem String die erste Zeile (Überschrift) sowie den nachfolgenden TR-Tag.

4. Zeilenweises Heraustrennen der Daten aus der HTML-Tabelle
Jetzt erfolgt die eigentliche Trennung des Strings in die einzelnen Zeilen mittels der Split() Funktion und dem TR-Tag als Trennzeichen. Danach wird jede einzelne Zeile in einer For-Schleife wiederum duch die Split-Funktion zerlegt und die einzelnen Zelleninhalte in ein Array geschrieben. Nach jedem Durchlauf der äußeren Schleife über die Tabellenzeilen werden die Daten aus dem Array in eine Tabelle geschrieben.

    arrZeilen = Split(strTableHTML, "")
    For i =0 To UBound(arrZeilen)
        If InStr(1, arrZeilen(i), "") = 0 Then GoTo nexti  'Zeilenende nicht gefunden
        
        'schließende TD und TR Tags am Ende entfernen
        strText = Left(arrZeilen(i), InStr(1, arrZeilen(i), "") - 1)
        
        'Die einzelne Zeile aufsplitten mit  als Trennzeichen
        arrSpalten = Split(strText, "")
        
        'Schleife über alle Zellen einer Zeile
        For k = 0 To UBound(arrSpalten)
            If InStr(1, arrSpalten(k), " 0 Then
                arrContent(k) = Split(Split(arrSpalten(k), ">")(2), "<")(0)
            Else
                arrContent(k) = Split(arrSpalten(k), ">")(1)
            End If
        Next k

        'Daten der Zeile in Tabelle schreiben
        db.Execute "Insert into tblImport (Feld1, Feld2, ...) Values('" & arrContent(0) & "','" & arrContent(1) & "','" & ....)

        For k = 0 To UBound(arrSpalten)
            arrContent(k) = ""
        Next k
nexti:
    Next i

Was dann noch folgt ist die übliche Aufräumaktion der Objekte, die auf Nothing gesetzt werden.

Wer jetzt noch die einzelnen Überschriften benötigt, z.B. für die Feldname der Importtabelle, für den hab ich noch den folgenden Code:

    arrHeadline = Split(Mid(strTableHTML, 11, InStr(1, strTableHTML, "") - 11), "")
    For i = LBound(arrHeadline) To UBound(arrHeadline)
        arrHeadline(i) = Split(arrHeadline(i), "<")(0)
    Next i

Ein Beispielprojekt findet ihr im Downloadbereich oder klickt einfach hier:
http://www.accessblog.de/?dl_id=8

Bis dahin
Andreas Vogt ©2011

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy