AW: selenium / vba
10.11.2022 18:24:11
Yal
Hallo Fred,
es ist tatsächlich so, dass das Scraping von Webseite ein gesundes Wissen über html erfordert. Aber nicht erschrecken lassen, man kommt Schritt für Schritt rein.
Tabelle sind z.B. immer zuerst Zeile, tr für table row, dann Spalte in 2 Geschmacksrichtungen: th für table header und td für table data.
Du kannst aber die gesamte html-Tabelle in einem VBA- oder gar Excel-Tabelle übergeben. (hast Du die weitere Videos bei WiseOwl angeschaut?)
Dass Du auf eine Webseite rechtsklicken kannst/musst, und "Untersuchen" auswählen, weisst Du schon. Aud einem Element in den Code kannst Du auch rechtklicken und Information wie XPath kopieren. Damit kannst Du einzelne Element einer Tabelle identifizieren.
Mit folgendem wird -auf eine bestimmte Webseite- einige Werte gesetzt (Region, Monate, Kilometer) und in einer Tabelle auf gezielte Element in Zeile 1 / Spalte 2 geklickt, dann Zeile 5 / Spalte3, dann 10 /3. "id" sind immer eindeutig in einer Webseite. Darauf kannst Du/musst Du aufbauen.
With myChromeDriver
.FindElementById("ref_market").SendKeys pMarket 'Region
.FindElementById("fcc_month").SendKeys 12 'Monate
.FindElementById("fcc_mileage").ClickAndHold
.FindElementById("fcc_mileage").SendKeys Keys.Home
.FindElementById("fcc_mileage").SendKeys "20000" 'Kilometer
.FindElementByXPath("//*[@id=""settings""]/tbody/tr[1]/td[2]/input").Click 'Standard-Modul ist UCC
.FindElementByXPath("//*[@id=""settings""]/tbody/tr[5]/td[3]/input").Click 'inkl. VAT
.FindElementByXPath("//*[@id=""settings""]/tbody/tr[10]/td[2]/input").Click 'Default vehicle type: Car (nur Car)
.FindElementById("bu_save").Click
End With
Diese XPath sind Texten. Die 1 und 2, 5 und 3, 10 und 2 kannst Du in Schleifen überschreiben, und so alle td einer Zeile und alle tr einer Tabelle ansprechen.
Aber in ein solcher Fall ist es leichter AsTable zu verwenden:
myArray = .FindElementByXPath("//*[@id=""settings""]/tbody").AsTable.Data
oder ähnlichen:
Data_Sub = .FindElementByClass("main").FindElementByTag("tbody").AsTable.Data
For Zeile = 2 To UBound(Data_Sub, 1)
For Spalte = 2 To UBound(Data_Sub, 2)
AusgabeDatei.WriteLine Trim(Data_Sub(Zeile, 1)) & ";" & Trim(Data_Sub(1, Spalte)) & ";" & Data_Sub(Zeile, Spalte)
Next
Next
Die Möglichkeit sind unendlich. Es muss leider sehr viel über Try&Error laufen. Aber Schritt für Schritt kommt man ran.
VG
Yal