Anzeige
Archiv - Navigation
1788to1792
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

VBA Web scraping Hilfe

VBA Web scraping Hilfe
26.10.2020 01:06:34
Andre
Guten Abend, ich habe ein Problem beim Auslesen der Daten. Hoffentlich kann mir jemand helfen.
Ich will von einer Internetseite (in NL) alle von vergangenen Veranstaltungen auslesen.
Leider schreibt er alles in eine Zeile:
Userbild
Kann mir jemand erklären, wie ich alles in eine extra Zelle bekomme?
Hier noch mein code:
Sub Import_data()
Dim appIE As Object
Dim myValue As String
Set appIE = CreateObject("internetexplorer.application")
With appIE
.navigate "https://www.beursgorilla.nl/Aandeel-Koers/612799/VIVORYON-THERAPEUT/Agenda.aspx"
.Visible = True
End With
Do While appIE.Busy
DoEvents
Loop
Set allRowOfData = appIE.document.getElementsByClassName("agendatbl")
myValue = allRowOfData(0).innerText
appIE.Quit
Set appIE = Nothing
Range("B1").Value = myValue
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: VBA Web scraping Hilfe
26.10.2020 05:42:53
Hajo_Zi
Daten, Text in Spalten.

AW: VBA Web scraping Hilfe
26.10.2020 08:45:41
volti
Hallo Andre,
schau mal, ob Du mit einer Einzelabholung besser hinkommst....

Code:
[Cc][+][-]
 
Option Explicit Sub Import_data() Dim appIE As Object, Obj As Object Dim i As Integer, j As Integer, sItems() As String Dim t Set appIE = CreateObject("internetexplorer.application") With appIE .navigate "https://www.beursgorilla.nl/Aandeel-Koers/612799/VIVORYON-THERAPEUT/Agenda.aspx" .Visible = True End With Do While appIE.Busy DoEvents Loop sItems() = Split("agendatbl__date,agendatbl__time,agendatbl__name,agendatbl__city", ",") On Error Resume Next For i = 0 To 3 Set Obj = appIE.document.getElementsByClassName(sItems(i)) For j = 0 To Obj.Length Cells(j + 1, i + 1).Value = Obj(j).innertext Next j Next i appIE.Quit Set appIE = Nothing End Sub
 
viele Grüße
Karl-Heinz

Anzeige
AW: VBA Web scraping Hilfe
26.10.2020 08:50:23
Günther
Moin,
leider (ich vertrete die Meinung "Gott sei Dank") ignoriert Power Query noch nicht einmal nette Bildchen… Sonst wäre das damit gewiss gut machbar.
 
Gruß
Günther  |  mein Excel-Blog
AW: VBA Web scraping Hilfe
26.10.2020 12:09:16
Andre
@volti. Danke das ist genau wonach ich gefragt habe. Funktioniert soweit super.
Eine Kleinigkeit hätte ich aber noch. Ich brauch nur die Daten der vergangenen Veranstaltungen. Also ab:
h2 class="infoblock__title"
Kann man das noch hinzufügen?
@Günther
Powerquery funktioniert tatsächlich nicht bzw. nur sehr beschränkt. 😉
Anzeige
AW: VBA Web scraping Hilfe
26.10.2020 12:46:47
volti
Hallo,
H2 ist ein anderes Tag und auch die Class ist auch anders. Das mit der einfachen Abfrage zu verquicken kompliziert das.
Um nicht noch weitere Abfragen da mit rein zu bringen, würde ich jetzt einfach die Schleifen vorher abbrechen, also nicht bis .length gehen oder nur index 0 (Überschrift) und ab index x bis index y gehen.
viele Grüße
Karl-Heinz
AW: VBA Web scraping Hilfe
26.10.2020 15:08:24
volti
Also ich habe nochmal reingeschaut.
Mit dem <H2> kann man in diesem Zusammenhang nichts anfangen, weil das bei der Auswertung der <div>-Tags mit den entsprechenden Classnames ja nicht auftaucht.
Geht man davon aus, dass bis zum H2 ggf. auch mehrere Termine liegen können, muss man sich die zweite Datumsposition suchen.
Vielleicht ist anliegende Version dazu geeignet.
Code:
[Cc][+][-]

Option Explicit Sub Import_data() Dim appIE As Object, Obj As Object Dim i As Integer, j As Integer, iBegin As Integer Dim sItems() As String, iOutzeile As Long Set appIE = CreateObject("internetexplorer.application") With appIE .navigate "https://www.beursgorilla.nl/Aandeel-Koers/612799/VIVORYON-THERAPEUT/Agenda.aspx" .Visible = True End With Do While appIE.Busy DoEvents Loop sItems() = Split("agendatbl__date,agendatbl__time,agendatbl__name,agendatbl__city", ",") 'Anfang ermitteln Set Obj = appIE.document.getElementsByClassName(sItems(0)) For iBegin = 1 To Obj.Length If Obj(iBegin).innertext Like "Datum" Then Exit For Next iBegin On Error Resume Next For i = 0 To 3 iOutzeile = 1 Set Obj = appIE.document.getElementsByClassName(sItems(i)) For j = iBegin To Obj.Length Cells(iOutzeile, i + 1).Value = Obj(j).innertext iOutzeile = iOutzeile + 1 Next j Next i appIE.Quit Set appIE = Nothing End Sub

____________
viele Grüße 😊
Karl-Heinz

Anzeige
AW: VBA Web scraping Hilfe
27.10.2020 11:45:56
Andre
Ecuh allen vielen dank für die Hilfe, werde mich heute nacht nach der Arbeit gleich mal ran setzen, auf jeden Fall nochmal 1000 dank, und bleibt alle sgesund und munter.
AW: VBA Web scraping Hilfe
26.10.2020 18:52:43
Zwenn
Hallo Andre, hallo Karl-Heinz
Ich hoffe ich trete Dir nicht auf die Füße Karl-Heinz, wenn ich eine andere Lösung poste. In den Kommentaren ist eigentlich alles erklärt:

Sub Import_data()
'URL teilen wegen Forums-Zeilen-Umbrüchen
Const url1 = "https://www.beursgorilla.nl/Aandeel-Koers"
Const url2 = "/612799/VIVORYON-THERAPEUT/Agenda.aspx"
Dim nodeCheckReady As Object
Dim nodeHistoryTable As Object
Dim nodeAllHistory As Object
Dim nodeOneHistory As Object
Dim currentRow As Long
Dim currentColumn As Long
Dim eventDate As String
Dim eventDateAsDate As Date
Dim eventName As String
Dim eventTime As String
Dim eventCity As String
'Startzeile und Startspalte initialisieren
currentRow = 2
currentColumn = 1
With CreateObject("internetexplorer.application")
.navigate url1 & url2
.Visible = True 'Auf False setzen für unsichtbar
Do While .Busy: DoEvents: Loop
'Warten, bis Seite auch die nachzuladenden Inhalte zur Verfügung stellt
'Das ist der Fall, sobald die benötigten Tabelleninhalte über ihren
'CSS Klassennamen gefunden werden können
'(Timeout kann man auch einbauen, falls benötigt)
Do
Set nodeCheckReady = .document.querySelector("h2[class='infoblock__title']")
Loop Until Not nodeCheckReady Is Nothing
'Die CSS Klasse agendatbl gibt es 2x im Dokument
'Das zweite Auftreten ist die gewünschte Auflistung
Set nodeHistoryTable = .document.getElementsByClassName("agendatbl")(1)
'Jetzt haben wir das ul-Tag mit allen li-Tags darin
'Wir brauchen alle li-Tags ohne Kopfzeile aus dem ul-Tag
'Das sind alle li-Tags mit der CSS Klasse agendatbl__item
Set nodeAllHistory = nodeHistoryTable.getElementsByClassName("agendatbl__item")
'Zugreifen auf jedes einzelne li-Tag in der NodeCollection
For Each nodeOneHistory In nodeAllHistory
'In den li-Tags stehen die Werte in div-Tags
'Da die div-Tags verschachtelt sind, gäbe es über
'eine NodeCollection mit getElementsByTagNames("div")
'Doppelungen, die man ausfiltern müsste
'Einfacher ist es über die 4 CSS Klassennamen
'Die Reihenfolge kann durch Umstellung der folgenden
'Codeblöcke nach belieben variiert werden
'Übernehmen des Datums
eventDate = nodeOneHistory.getElementsByClassName("agendatbl__date")(0).innertext
eventDate = Replace(eventDate, "-", ".")
eventDateAsDate = eventDate
Cells(currentRow, currentColumn).Value = eventDateAsDate
currentColumn = currentColumn + 1
'Übernehmen des Namens
eventName = nodeOneHistory.getElementsByClassName("agendatbl__name")(0).innertext
Cells(currentRow, currentColumn) = eventName
currentColumn = currentColumn + 1
'Übernehmen der Zeit
eventTime = nodeOneHistory.getElementsByClassName("agendatbl__time")(0).innertext
Cells(currentRow, currentColumn) = eventTime
currentColumn = currentColumn + 1
'Übernehmen der Stadt
eventCity = nodeOneHistory.getElementsByClassName("agendatbl__city")(0).innertext
Cells(currentRow, currentColumn) = eventCity
currentColumn = 1
currentRow = currentRow + 1
Next nodeOneHistory
'Internet Explorer schließen
.Quit
End With 'IE
End Sub
Viele Grüße,
Zwenn
Anzeige
AW: VBA Web scraping Hilfe
26.10.2020 19:38:49
volti
Nö Zwenn,
alles gut.
Ich hatte mich (aus Zeitgründen und als Weiterentwicklung der Vorlage) nicht so intensiv damit beschäftigt.
viele Grüße
Karl-Heinz
Ok, alles klar :-) [owT]
26.10.2020 23:57:55
Zwenn
AW: VBA Web scraping Hilfe
28.10.2020 12:34:41
Andre
Guten morgen,
Wenn ich
Dim eventDateAsDate As Date
ändere in
Dim eventDateAsDate As String
macht der Code jetzt exact was ich gefragt hatte. Vielen Danke nochmal dafür.
Ein kleines Problem habe ich jedoch noch:
Ein Teil der URL soll variabel sein, heißt ich habe eine Tabelle wo drinsteht:
612799/VIVORYON-THERAPEUT
bzw.
613005/NIBC-Holding-NV
usw.
Bei den anderen Makros die ich habe konnte ich das lösen mit:
gorid = ActiveCell.Value
https://www.beursgorilla.nl/Aandeel-Koers/"
& gorid & "/ Agenda.aspx 
Bei Const Anweisungen funktioniert das laut google aber nicht so einfach.
Gibt es hierfür auch eine Lösung?
Anzeige
AW: VBA Web scraping Hilfe
28.10.2020 13:47:45
Zwenn
Hallo Andre,
das Du das Datum als String wolltest war mir nicht klar. Gibts dafür einen bestimmten Grund? Bin nur Neugierig. Du kannst es so lassen, kannst den Blub mit eventDateAsDate aber auch einfach löschen und eventDate in die Zellen eintragen lassen. Das ist ja bereits ein String.
Const ist das Schlüsselwort, um eine Konstante zu definieren. Die kann man zur Laufzeit nicht ändern. Du kannst die Konstante mit Dim als Variable deklarieren. Du musst dann halt die URL in Deiner Schleife einsetzen, wie Du es vorher gemacht hast.
Viele Grüße,
Zwenn

147 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige