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

Forumthread: Tabelle aus HTML Dokument auslesen

Tabelle aus HTML Dokument auslesen
14.01.2017 15:24:56
Mirco
Hallo Zusammen
Vornweg -> Ich besitze lediglich rudimentäre Kenntnisse zu VBA
Mein Ziel -> Ich möchte ein Fach aus einem Online-Stundenplan in Excel einlesen. Dieser ist sehr verschachtelt. D.h. es sind mehrere Tabellen in Tabellen (siehe URL: https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm). Ich habe versucht den Inhalt einzelner Tabellen, Tabellenzeilen und Tabellenobjekte auszulesen(
,,
). Dies hat funktionniert, nur leider ist die Tabelle sehr kompliziert organisiert. Es gibt nicht wirklich eine Logik wo man sagen kann dass z.B. jeweils in der 3. Zeile eine neue Stunde anfängt.
Der HTML-code ist jedoch glückicherweise so, dass jedes Fach eine Farbe hat (bgcolor=).
Meine Frage -> Wie kann ich in dem HTML-Dokument genau nach diesem Begriff suchen, die Tabelle wo er drinsteht einlesen und in der HTML-Tabelle einer Zeit zuordnen?
Ich hoffe ich habe mich verständlich ausgedrückt
Vielen Dank im Voraus und Gruss
Hier mein VBA-Script:
Option Explicit

Public Sub pbsubstundenplan()
Dim IE As InternetExplorer
Dim HTML As HTMLDocument
Dim intzaehler As Integer
Dim strname As String
intzaehler = 0
Set IE = New InternetExplorer
IE.Visible = False
IE.navigate "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/c/c00022.htm"
Do While IE.readyState  READYSTATE_COMPLETE
DoEvents
Loop
Set HTML = IE.document
Do
intzaehler = intzaehler + 1
strname = Trim(HTML.getElementsByTagName("table")(intzaehler).innerText)
If Not IsEmpty(strname) Then
Me.Range("A" & intzaehler).Value = intzaehler
Me.Range("B" & intzaehler).Value = strname
Else: Exit Do
End If
Loop
End Sub
P.S.: das Script gibt einen Laufzeitfehler 91 aus. Ich verstehe leider auch nicht ganz warum..
HTML sehr wirr
Michael

Hi Mirco,
ich habe mir das Original mal angesehen: der HTML-Code ist ziemlich wirr; alleine die Werte auszulesen bringt eigentlich nichts, weil die Position innerhalb der Tabelle entscheidend für die Zuweisung von Wochentag & Zeit ist.
D.h., man müßte die ganze Table-Arithmetik (mit den ganzen col- & rowspans) auswerten.
Machbar ist ja immer alles; die Frage ist nur, mit welchem Aufwand. Wenn es Dir darum geht, einen Stundenplan mit Deinen eigenen Kursen zu erstellen, ist es wahrscheinlich schneller händisch erledigt als programmiert.
Hm, hm. Lies die Pläne mal damit ein (Makro in ein allg. Modul, z.B. Modul1, das sind die Dinger, die automatisch erzeugt werden, wenn Du den Makrorekorder benutzt):
Option Explicit
Sub NochEinTest()
'Mirco Ackermann
'Tabelle aus HTML Dokument auslesen
Dim oData As New DataObject
's. a.:
' http://www.online-excel.de/ _
excel/singsel_vba.php?f=28
Dim objXMLHTTP As Object
Dim sURL As String, sResult As String, ausCP$
Dim pLi As Long, pRe As Long
Dim mC&, i& ' max. Spalte, i &=as long
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
'sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/c/c00022.htm"
sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm"
objXMLHTTP.Open "GET", sURL, False
objXMLHTTP.Send
If objXMLHTTP.Status  200 Then
MsgBox "Status  200: " & objXMLHTTP.Status
Exit Sub
End If
sResult = objXMLHTTP.ResponseText
Set objXMLHTTP = Nothing
ActiveSheet.Cells.Clear
pLi = InStr(sResult, " 0 Then
pRe = InStrRev(sResult, "
") If pRe 0 Then ausCP = Mid(sResult, pLi, pRe - pLi + 1) & "/TABLE>" MsgBox Right(ausCP, 50) ' stimmt das Ende? With oData .SetText ausCP .PutInClipboard End With Range("B3").Select ActiveSheet.PasteSpecial Format:="Unicode-Text", Link:=False, _ DisplayAsIcon:=False Stop mC = Cells(3, Columns.Count).End(xlToLeft).Column Range("B2").Resize(, mC).FormulaLocal = "=Anzahl2(B3:B500)" For i = mC To 5 Step -1 If Cells(2, i) = 0 Then Columns(i).Delete Next End If End If End Sub

Es kopiert die komplette Tabellenstruktur in das gerade aktive Tabellenblatt, schreibt die Formel = Anzahl2 in die Zeile 2, die ermittelt, ob in der Spalte Daten stehen, und löscht selbige, wenn nichts vorhanden ist.
Du hast ja zwei unterschiedliche Links angegeben; der im Makro erzeugt eine einzelne Tabelle, der andere drei untereinander.
Jedenfalls stellt Dir das Makro eine "geraffte" Ansicht zur Verfügung, die sich innerhalb von Excel sicher leichter auswerten läßt als das eklige HTML.
Wenn Du genau beschreibst, wie die Ausgabe aussehen soll, wird sich's mit vertretbarem Aufwand machen lassen.
Schöne Grüße,
Michael
P.S.: Das Makro verwendet die Zwischenablage, die nicht ohne Weiteres funktioniert (Infos dazu im eingestreuten link auf online-Excel).
Damit Du damit keinen Ärger hast, anbei doch eine Datei mit leicht geändertem Makro: https://www.herber.de/bbs/user/110564.xlsm
AW: HTML sehr wirr
Mirco

Hallo Michael
Vielen Dank für deine super Antwort!
Die HTML-Tabelle ist wirklich sehr wirr. Wahrscheinlich ist aus diesem Grund unsere Schule nicht fähig, benutzerdefinierte Stundenpläne zu generieren. Ich finde den Ansatz aber sehr gut von dir, erst einmal alle Stundenpläne in Excel zu integrieren und anschliessend zu bearbeiten (auch wenn ich den code nicht vollständig lesen kann).
Ich versuche mal etwas zu schreiben, das die integrierten Pläne bearbeitet und werde bestimmt bald weitere Fragen posten! ;-)
Gruss Mirco
AW: HTML sehr wirr
Michael

Hi Mirco,
ich sehe grad, daß die Forumssoftware ein paar Zeilen verhackstückt hat, z.B.
pLi = InStr(sResult, " 0 Then

Das liegt wohl an den enthaltenen ">" usw.
Wenn Du mir mitteilst, was Du nicht verstehst, erkläre ich's Dir gerne.
Happy Exceling,
Michael
AW: HTML sehr wirr
Mirco

Hallo Michael
Den folgenden Part begreife ich nicht ganz. Man zählt zuerst von links bis das gesuchte Element vorkommt, dann von rechts. Aber was macht man dann mit diesen Zahlen?

If pLi  0 Then
pRe = InStrRev(sResult, "
") If pRe 0 Then ausCP = Mid(sResult, pLi, pRe - pLi + 1) & "/TABLE>" ' MsgBox Right(ausCP, 50) ' stimmt das Ende?
Ich habe jetzt versucht alle Stundenpläne die aus dem Internet gesogen wurden zusammenzufügen und ein bisschen schön zu machen. Dies ging nicht schlecht. Nur weiss ich noch nicht ganz wie ich es mit den Überschneidungen regeln soll.
Ein weiterer Punkt ist jedoch die automatische Generierung der links. Dazu müssten die "Elemente" von diesem Frame geladen werden: https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/frames/navbar.htm
Ich weiss nicht genau wie ich dieses Frame ansteuern soll. Es ist ja keine id vorhanden. Und auch wenn sie vorhanden wäre: wie kriegt man alle Elemente aus option /option heraus?
Hier das File, wie es jetzt steht https://www.herber.de/bbs/user/110695.xlsm
Vielen Dank nochmals für deine kompetente Hilfe!
Gruss Mirco
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
HTML sehr wirr
15.01.2017 14:50:52
Michael
Hi Mirco,
ich habe mir das Original mal angesehen: der HTML-Code ist ziemlich wirr; alleine die Werte auszulesen bringt eigentlich nichts, weil die Position innerhalb der Tabelle entscheidend für die Zuweisung von Wochentag & Zeit ist.
D.h., man müßte die ganze Table-Arithmetik (mit den ganzen col- & rowspans) auswerten.
Machbar ist ja immer alles; die Frage ist nur, mit welchem Aufwand. Wenn es Dir darum geht, einen Stundenplan mit Deinen eigenen Kursen zu erstellen, ist es wahrscheinlich schneller händisch erledigt als programmiert.
Hm, hm. Lies die Pläne mal damit ein (Makro in ein allg. Modul, z.B. Modul1, das sind die Dinger, die automatisch erzeugt werden, wenn Du den Makrorekorder benutzt):
Option Explicit
Sub NochEinTest()
'Mirco Ackermann
'Tabelle aus HTML Dokument auslesen
Dim oData As New DataObject
's. a.:
' http://www.online-excel.de/ _
excel/singsel_vba.php?f=28
Dim objXMLHTTP As Object
Dim sURL As String, sResult As String, ausCP$
Dim pLi As Long, pRe As Long
Dim mC&, i& ' max. Spalte, i &=as long
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
'sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/c/c00022.htm"
sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm"
objXMLHTTP.Open "GET", sURL, False
objXMLHTTP.Send
If objXMLHTTP.Status  200 Then
MsgBox "Status  200: " & objXMLHTTP.Status
Exit Sub
End If
sResult = objXMLHTTP.ResponseText
Set objXMLHTTP = Nothing
ActiveSheet.Cells.Clear
pLi = InStr(sResult, "
0 Then pRe = InStrRev(sResult, "
") If pRe 0 Then ausCP = Mid(sResult, pLi, pRe - pLi + 1) & "/TABLE>" MsgBox Right(ausCP, 50) ' stimmt das Ende? With oData .SetText ausCP .PutInClipboard End With Range("B3").Select ActiveSheet.PasteSpecial Format:="Unicode-Text", Link:=False, _ DisplayAsIcon:=False Stop mC = Cells(3, Columns.Count).End(xlToLeft).Column Range("B2").Resize(, mC).FormulaLocal = "=Anzahl2(B3:B500)" For i = mC To 5 Step -1 If Cells(2, i) = 0 Then Columns(i).Delete Next End If End If End Sub

Es kopiert die komplette Tabellenstruktur in das gerade aktive Tabellenblatt, schreibt die Formel = Anzahl2 in die Zeile 2, die ermittelt, ob in der Spalte Daten stehen, und löscht selbige, wenn nichts vorhanden ist.
Du hast ja zwei unterschiedliche Links angegeben; der im Makro erzeugt eine einzelne Tabelle, der andere drei untereinander.
Jedenfalls stellt Dir das Makro eine "geraffte" Ansicht zur Verfügung, die sich innerhalb von Excel sicher leichter auswerten läßt als das eklige HTML.
Wenn Du genau beschreibst, wie die Ausgabe aussehen soll, wird sich's mit vertretbarem Aufwand machen lassen.
Schöne Grüße,
Michael
P.S.: Das Makro verwendet die Zwischenablage, die nicht ohne Weiteres funktioniert (Infos dazu im eingestreuten link auf online-Excel).
Damit Du damit keinen Ärger hast, anbei doch eine Datei mit leicht geändertem Makro: https://www.herber.de/bbs/user/110564.xlsm
Anzeige
AW: HTML sehr wirr
16.01.2017 16:14:42
Mirco
Hallo Michael
Vielen Dank für deine super Antwort!
Die HTML-Tabelle ist wirklich sehr wirr. Wahrscheinlich ist aus diesem Grund unsere Schule nicht fähig, benutzerdefinierte Stundenpläne zu generieren. Ich finde den Ansatz aber sehr gut von dir, erst einmal alle Stundenpläne in Excel zu integrieren und anschliessend zu bearbeiten (auch wenn ich den code nicht vollständig lesen kann).
Ich versuche mal etwas zu schreiben, das die integrierten Pläne bearbeitet und werde bestimmt bald weitere Fragen posten! ;-)
Gruss Mirco
Anzeige
AW: HTML sehr wirr
16.01.2017 17:11:07
Michael
Hi Mirco,
ich sehe grad, daß die Forumssoftware ein paar Zeilen verhackstückt hat, z.B.
pLi = InStr(sResult, " 0 Then

Das liegt wohl an den enthaltenen ">" usw.
Wenn Du mir mitteilst, was Du nicht verstehst, erkläre ich's Dir gerne.
Happy Exceling,
Michael
Anzeige
AW: HTML sehr wirr
19.01.2017 09:16:31
Mirco
Hallo Michael
Den folgenden Part begreife ich nicht ganz. Man zählt zuerst von links bis das gesuchte Element vorkommt, dann von rechts. Aber was macht man dann mit diesen Zahlen?

If pLi  0 Then
pRe = InStrRev(sResult, "
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Tabelle aus HTML Dokument auslesen


Schritt-für-Schritt-Anleitung

  1. Vorbereitung der Umgebung:

    • Stelle sicher, dass Du Microsoft Excel (idealerweise 2016 oder höher) und grundlegende Kenntnisse in VBA hast.
  2. VBA-Editor öffnen:

    • Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.
  3. Modul erstellen:

    • Klicke mit der rechten Maustaste auf „VBAProject (DeineDatei.xlsx)“ und wähle „Einfügen“ > „Modul“.
  4. VBA-Code einfügen:

    • Füge den folgenden Code in das Modul ein:
    Option Explicit
    Sub StundenplanAuslesen()
       Dim IE As Object
       Dim HTML As Object
       Dim intzaehler As Integer
       Dim strname As String
       intzaehler = 0
       Set IE = CreateObject("InternetExplorer.Application")
       IE.Visible = False
       IE.navigate "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm"
    
       Do While IE.readyState <> 4: DoEvents: Loop
       Set HTML = IE.document
    
       Do
           intzaehler = intzaehler + 1
           strname = Trim(HTML.getElementsByTagName("table")(intzaehler).innerText)
           If Not IsEmpty(strname) Then
               Me.Range("A" & intzaehler).Value = intzaehler
               Me.Range("B" & intzaehler).Value = strname
           Else: Exit Do
           End If
       Loop
       IE.Quit
    End Sub
  5. Makro ausführen:

    • Schließe den VBA-Editor und kehre zu Excel zurück. Drücke ALT + F8, wähle „StundenplanAuslesen“ und klicke auf „Ausführen“.
  6. Daten überprüfen:

    • Überprüfe das aktive Arbeitsblatt, um sicherzustellen, dass die Daten korrekt importiert wurden.

Häufige Fehler und Lösungen

  • Laufzeitfehler 91: Dieser Fehler tritt auf, wenn ein Objekt nicht korrekt initialisiert wurde. Stelle sicher, dass die URL korrekt ist und die Internetverbindung besteht.

  • Tabelle nicht gefunden: Wenn der HTML-Code sehr komplex ist, kann es sein, dass die gesuchte Tabelle nicht an der erwarteten Stelle ist. Überprüfe den HTML-Code und passe die Indizes im VBA-Skript an.

  • Zwischenablage-Probleme: Das Skript verwendet die Zwischenablage, die in einigen Excel-Versionen zu Problemen führen kann. Stelle sicher, dass Du Excel im Administratormodus ausführst.


Alternative Methoden

  • Power Query: Du kannst Power Query verwenden, um Daten aus Webseiten zu importieren. Gehe zu „Daten“ > „Daten abrufen“ > „Aus anderen Quellen“ > „Aus dem Web“ und gib die URL ein.

  • Manuelles Kopieren: Wenn der HTML-Code einfach ist, kannst Du die Tabelle direkt aus dem Browser kopieren und in Excel einfügen.


Praktische Beispiele

  • Stundenplan erstellen Excel: Erstelle einen Stundenplan in Excel, indem Du die importierten Daten nach Wochentagen und Zeiten organisiert. Nutze Pivot-Tabellen, um eine bessere Übersicht zu erhalten.

  • HTML Codes Tabelle: Verwende die Funktion WEBSERVICE() in Excel, um HTML-Daten direkt zu importieren und zu analysieren, wenn die Struktur einfach genug ist.


Tipps für Profis

  • Regex verwenden: Nutze reguläre Ausdrücke, um spezifische Daten aus dem HTML-Code zu extrahieren, falls die Struktur sehr kompliziert ist.

  • Automatisierung: Automatisiere den Import-Prozess, indem Du das Makro regelmäßig zu festgelegten Zeiten laufen lässt, um immer die neuesten Daten zu erhalten.

  • Dokumentation: Halte Deinen Code gut dokumentiert, damit Du später Änderungen schnell vornehmen kannst, insbesondere wenn sich die Struktur der HTML-Seite ändert.


FAQ: Häufige Fragen

1. Wie kann ich eine Tabelle in HTML erstellen? Du kannst eine Tabelle in HTML mit den entsprechenden <table>, <tr> und <td> Tags erstellen. Hier ein Beispiel:

<table>
   <tr>
      <td>Fach</td>
      <td>Wochentag</td>
   </tr>
   <tr>
      <td>Mathematik</td>
      <td>Montag</td>
   </tr>
</table>

2. Was ist ein bfh Stundenplan? Der bfh Stundenplan ist ein Stundenplan, der an der Berner Fachhochschule (BFH) verwendet wird und die Kurse, Zeiten und Räume der Studierenden darstellt.

3. Wie kann ich HTML-Code für eine Tabelle in Excel verwenden? Du kannst den HTML-Code der Tabelle in das VBA-Skript einfügen, um die Daten direkt in Excel zu importieren, wie im obigen Beispiel gezeigt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige