Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1520to1524
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

Webseite aus lesen in eine Tabelle

Webseite aus lesen in eine Tabelle
28.10.2016 18:30:19
Stefan
Hallo,
ich möchte gern die Webseite https://livetiming.raceresults.nu/demo#screen-resultsaus lesen und in einer einfachen Tabelle abspeichern mit den Spalten
Pos Startnummer Name Lap Gap Best Last Pit
Ich habe bereits eine ähnliche Lösung für andere Webseite, die lässt sich aber mit Excel Bordmitteln auslesen.
Da habe ich auch ein Makro, was die Abfrage im Web jede Minute einmal macht.
Ziel wäre jetzt diese Tabelle alle 30 sec zu aktualisieren.
Freue mich auf Eure Antworten.
Vielen Dank.
Viele Grüsse
Stefan

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Webseite aus lesen in eine Tabelle
28.10.2016 18:50:57
Stefan
die Webseite heisst natürlich:
https://livetiming.raceresults.nu/demo#screen-results
AW: Webseite aus lesen in eine Tabelle
28.10.2016 20:19:25
Bastian
Hey Ho
Ich hab mich gerade das erste mal mit so was beschäftigt aber wie es aussieht geht es =D
Gruß BAsti

  • Option Explicit
    Option Base 1
    Const strAddress = "https://livetiming.raceresults.nu/demo#screen-results"
    Const strSheet = "raceresults"
    Public Sub CopyHtmlToWorksheet()
    Dim S As Shape
    Dim Last As Long
    Dim c As Range
    Application.DisplayAlerts = False
    On Error Resume Next
    Sheets(strSheet).Delete
    On Error GoTo 0
    CopyHtmlToClipboard (strAddress)
    With Sheets.Add
    .Name = strSheet
    .Paste
    Last = .UsedRange.Rows.Count
    Set c = .Columns(1).Find("POS", LookIn:=xlValues)
    .Rows("1:" & c.Row - 1).Delete
    .Rows(c.End(xlDown).Row & ":" & Last).Delete
    For Each S In .Shapes
    S.Delete
    Next
    End With
    Application.DisplayAlerts = True
    End Sub
    

    Private Sub CopyHtmlToClipboard(wwwAdress As String)
    Dim appIE As Object
    Set appIE = CreateObject("InternetExplorer.Application")
    appIE.navigate wwwAdress
    appIE.Visible = True
    Do: Loop Until appIE.Busy = False
    appIE.ExecWB 17, 0 'Select All
    Do: Loop Until appIE.Busy = False
    appIE.ExecWB 12, 0 'Copy
    Do: Loop Until appIE.Busy = False
    appIE.Application.Quit
    Set appIE = Nothing
    End Sub
    

  • Anzeige
    ...und hier noch ein zweiter Lösungsweg
    28.10.2016 20:52:55
    Martin
    Hallo Stefan,
    jetzt hast du die Qual der Wahl, ob du Bastians oder meinen Lösungsweg nimmst. Die Lap-Spalte wirst du anpassen müssen, da ich nicht wusste welche Spalte du meintest.
    Sub GetRaceResults()
    Dim IEApp As Object, i As Long, j As Long
    Set IEApp = CreateObject("InternetExplorer.Application")
    IEApp.Visible = True
    IEApp.navigate "https://livetiming.raceresults.nu/demo#screen-results"
    Do: Loop Until IEApp.Busy = False
    Do: Loop Until IEApp.Busy = False
    Do: Loop Until IEApp.document.readyState = "complete"
    With IEApp.document
    For i = 0 To .all.Length - 1
    If .all.Item(i).nodeName = "TABLE" Then
    If .all.Item(i).Rows(0).Cells(0).innerText = "POS" Then
    For j = 0 To .all.Item(i).Rows.Length - 1
    With .all.Item(i).Rows(j)
    Cells(j + 1, 1) = .Cells(0).innerText
    Cells(j + 1, 2) = .Cells(3).innerText
    Cells(j + 1, 3) = .Cells(4).innerText
    Cells(j + 1, 4) = .Cells(6).innerText
    Cells(j + 1, 5) = .Cells(7).innerText
    Cells(j + 1, 6) = .Cells(9).innerText
    Cells(j + 1, 7) = .Cells(8).innerText
    Cells(j + 1, 8) = .Cells(10).innerText
    End With
    Next j
    End If
    End If
    Next i
    End With
    Columns("A:H").EntireColumn.AutoFit
    IEApp.Quit
    Set IEApp = Nothing
    End Sub
    
    Viele Grüße
    Martin
    Anzeige
    AW: ...und hier noch ein zweiter Lösungsweg
    28.10.2016 21:01:47
    Stefan
    Hallo Basta und Martin,
    schon mal vielen Dank, ich probiere es morgen aus!
    Die Spalte Lap, da muss ich den String aus GAP nehmen.
    Ich melde mich auf jeden Fall noch mal wenn ich es ausprobiert habe.
    DANKE!!
    Grüsse
    Stefan
    AW: ...und hier noch ein zweiter Lösungsweg
    28.10.2016 21:28:08
    Matthias
    Hallo Stefan! Noch ein Hinweis, bevor du dich morgen rumplagst. Evtl. geht nur die Variante von Basti. Grund ist der Aufbau deiner Internetseite. Die Einträge sind nicht in einer Tabelle (aus HTML Code ) eingetragen sondern Teil eines JavaScriptes. Vermtl. wird deshalb nur die Copy / Paste Variante klappen. Aber falls du mal ne Seite mit richtigen table Tags hast, wäre die Variante von Martin einfacher und besser zu handeln. VG
    Anzeige
    AW: ...und hier noch ein zweiter Lösungsweg
    29.10.2016 19:59:03
    Stefan
    Hallo Basti,
    Hallo Martin,
    recht herzlichen Dank. Ich habe beide ausprobiert und beide funktionieren.
    Den IE muss ich nicht unbedingt sehen, daher habe ich die Visibilität ausgeschaltet.
    Was muss ich noch machen?
    - das Makro muss kontinuierlich das Sheet updaten, zu Beispiel alle 30 sec
    - bei Bastis Variante muss ich noch ändern, dass das Sheet nicht jedesmal neu erstellt wird.
    Ich werde aber mit beiden Varianten weiter machen, da ich noch herausfinden muss, welche schneller ist :-)
    Herzlichen Dank und viele Grüsse
    Stefan
    AW: ...und hier noch ein zweiter Lösungsweg
    29.10.2016 22:38:06
    Martin
    Hallo Stefan,
    ich will jetzt nicht eingebildet klingen, aber wie Matthias schon geschrieben hat, ist meine Variante sauberer. Ich habe sie jetzt noch etwas getunt, aber eigentlich ist noch mehr Potential vorhanden (z.B. wenn man den Internet Explorer nicht jedes Mal neu starten würde, sondern offen lässt und einfach nur die Seite neu lädt). Hier der neue Code mit einer Dauerschleife, in der du nur Zeit angeben musst bis wann es laufen soll:
    Sub ResultLoop()
    'In TimeSerial(hh:mm:ss) festlegen bis wann die Schleife laufen soll
    If Time() > TimeSerial(22, 30, 10) Then Exit Sub
    Application.OnTime Now + TimeValue("00:00:30"), "GetRaceResults"
    End Sub
    Sub GetRaceResults()
    MsgBox "Jetzt"
    Dim IEApp As Object, htmlTable As Object, j As Long
    Set IEApp = CreateObject("InternetExplorer.Application")
    IEApp.Visible = True
    IEApp.navigate "https://livetiming.raceresults.nu/demo#screen-results"
    Do: Loop Until IEApp.Busy = False
    Do: Loop Until IEApp.Busy = False
    Do: Loop Until IEApp.document.readyState = "complete"
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Cells.Delete
    For Each htmlTable In IEApp.document.all.Tags("TABLE")
    If htmlTable.Rows(0).Cells(0).innerText = "POS" Then
    For j = 0 To htmlTable.Rows.Length - 1
    With htmlTable.Rows(j)
    Cells(j + 1, 1) = .Cells(0).innerText
    Cells(j + 1, 2) = .Cells(3).innerText
    Cells(j + 1, 3) = .Cells(4).innerText
    Cells(j + 1, 4) = .Cells(6).innerText
    Cells(j + 1, 5) = .Cells(7).innerText
    Cells(j + 1, 6) = .Cells(9).innerText
    Cells(j + 1, 7) = .Cells(8).innerText
    Cells(j + 1, 8) = .Cells(10).innerText
    End With
    Next j
    Exit For
    End If
    Next
    Columns("A:H").EntireColumn.AutoFit
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    IEApp.Quit
    Set IEApp = Nothing
    Call ResultLoop
    End Sub
    
    Viele Grüße
    Martin
    Anzeige
    AW: ...und hier noch ein zweiter Lösungsweg
    29.10.2016 22:44:46
    Martin
    Hallo Stefan,
    du musst natürlich in dem Makro GetRaceResults() noch das MsgBox "Jetzt" entfernen, das hatte ich nur zum Testen eingesetzt ;-)
    Viele Grüße
    Martin
    AW: ...und hier noch ein zweiter Lösungsweg
    30.10.2016 11:37:14
    Stefan
    Hallo Martin,
    Vielen Dank für Deine Erweiterung.
    Das stimmt, bei deiner Lösung kann ich genau bestimmen, welche Spalten ich einlesen will, bei der Lösung von Bastian kommt immer alles.
    Aber ich behalte auch diese im Auge, der andere Ansatz kann auch mal hilfreich sein.
    3 Punkte sind noch, vielleicht kannst Du mir bei einem helfen:
    Zum einen will ich nicht jedesmal den IE neu starten, zweitens, was muss ich machen, damit das ganze auch auf dem Apple läuft mit Safari oder Chrome und drittens, es gibt abendzug grafische Inhalte, wie grüne Punkte oder Pfeile auf und ab.
    ( gerade jetzt https://livetiming.raceresults.nu/autodromodoalgarve#screen-results oder https://livetiming.raceresults.nu/mbracesupport#screen-results )
    Die kommen bei keiner Lösung mit, was müsste man tun, damit die auch erscheinen?
    Vielen Dank und schöne Grüsse
    Stefan
    Anzeige
    AW: ...und hier noch ein zweiter Lösungsweg
    31.10.2016 17:05:17
    Martin
    Hallo Stefan,
    okay, hier die Lösung ohne ständigem Neustart des InternetExplorers:
    Option Explicit
    Private IEApp As Object
    Sub ResultLoop()
    'In TimeSerial(hh:mm:ss) festlegen bis wann die Schleife laufen soll
    If Time() > TimeSerial(22, 30, 10) Then
    If Not IEApp Is Nothing Then
    IEApp.Quit
    Set IEApp = Nothing
    Exit Sub
    End If
    End If
    Application.OnTime Now + TimeValue("00:00:30"), "GetRaceResults"
    End Sub
    Sub GetRaceResults()
    Dim htmlTable As Object, j As Long
    If IEApp Is Nothing Then
    Set IEApp = CreateObject("InternetExplorer.Application")
    IEApp.Visible = False
    IEApp.navigate "https://livetiming.raceresults.nu/autodromodoalgarve#screen-results"
    Else
    IEApp.Refresh
    End If
    Do: Loop Until IEApp.Busy = False
    Do: Loop Until IEApp.Busy = False
    Do: Loop Until IEApp.document.readyState = "complete"
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Cells.Delete
    For Each htmlTable In IEApp.document.all.tags("TABLE")
    If htmlTable.Rows(0).Cells(0).innerText = "POS" Then
    For j = 0 To htmlTable.Rows.Length - 1
    With htmlTable.Rows(j)
    Cells(j + 1, 1) = .Cells(0).innerText
    Cells(j + 1, 2) = .Cells(3).innerText
    Cells(j + 1, 3) = .Cells(4).innerText
    Cells(j + 1, 4) = .Cells(6).innerText
    Cells(j + 1, 5) = .Cells(7).innerText
    Cells(j + 1, 6) = .Cells(9).innerText
    Cells(j + 1, 7) = .Cells(8).innerText
    Cells(j + 1, 8) = .Cells(10).innerText
    End With
    Next j
    Exit For
    End If
    Next
    Columns("A:H").EntireColumn.AutoFit
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Call ResultLoop
    End Sub
    
    Da ich kein Mac-User bin, kann ich dir leider fast nicht weiterhelfen. Aber einen möglichen Lösungsansatz habe ich dennoch: https://de.wikipedia.org/wiki/Selenium
    Selenium läuft wohl auch unter Mac, ich habe damit unter Windows bereits Firefox angesteuert.
    Ich habe keine Ahnung welche "grüne Punkte oder Pfeile" du meinst. Wenn diese nicht als Textinhalt nach Excel übertragen werden, handelt es sich wahrscheinlich um irgendwelche Objekte (z.B. Grafiken) und müssten explizit in den HTML-Zellen abgefragt und - falls vorhanden - nach Excel übertragen werden. Das ist mir jetzt aber zu umständlich zu programmieren ;-)
    Ich hatte noch eine andere Variante ohne InternetExplorer versucht, die ich noch besser finde und die auch superschnell läuft. Leider ist diese Variante auf deine Seite wegen des JavaScriptes nicht anwendbar. Da ich die Programmierarbeit nun - wenn auch umsonst - gemacht habe, poste ich den Code trotzdem mal:
    Sub Variante2()
    Dim HTTP As Object, strURL As String
    Dim odoc As Object, htmlTable As Object, j As Integer
    Set HTTP = CreateObject("MSXML2.ServerXMLHTTP")
    Set odoc = CreateObject("htmlfile")
    strURL = "https://livetiming.raceresults.nu/autodromodoalgarve#screen-results"
    HTTP.Open "GET", strURL, False
    HTTP.send
    odoc.Open
    odoc.write HTTP.responseText
    odoc.Close
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Cells.Delete
    For Each htmlTable In odoc.all.tags("TABLE")
    If htmlTable.Rows(0).Cells(0).innerText = "POS" Then
    For j = 0 To htmlTable.Rows.Length - 1
    With htmlTable.Rows(j)
    Cells(j + 1, 1) = .Cells(0).innerText
    Cells(j + 1, 2) = .Cells(1).innerText
    Cells(j + 1, 3) = .Cells(2).innerText
    Cells(j + 1, 4) = .Cells(3).innerText
    Cells(j + 1, 5) = .Cells(4).innerText
    Cells(j + 1, 6) = .Cells(5).innerText
    Cells(j + 1, 7) = .Cells(8).innerText
    Cells(j + 1, 8) = .Cells(10).innerText
    End With
    Next j
    Exit For
    End If
    Next
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
    
    Viele Grüße
    Martin
    Anzeige
    AW: ...und hier noch ein zweiter Lösungsweg
    31.10.2016 20:12:35
    Stefan
    Halo Martin,
    recht herzlichen Dank!
    das ist schon super so und mehr als ein Anfang.
    Deine letzte Variante nehme ich gern mit und kann sie an anderer Stelle, wo kein Java Script eingesetzt wird einsetzen. Sie war nicht umsonst.
    Danke!
    Herzliche Grüsse
    Stefan
    AW: Webseite aus lesen in eine Tabelle
    31.10.2016 20:15:08
    Stefan
    Hallo Basti und Martin,
    bitte schreibt mir mal noch eure e-mail Adresse an Stefan.uhle@gmail.com.
    Ich möchte mich noch bedanken.
    Danke.
    Grüsse
    Stefan

    302 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige