Daten aus Tabelle einer Webseite importieren
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)) ") - 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 iDabei 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), "
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=8Bis dahin
Andreas Vogt ©2011Leave a Reply
OfficeFolders theme by
Themocracy