AW: Web Scraping Anzahl div Class auslesen
25.09.2023 13:15:57
Zwenn
Hallo Reaper,
ich habe mir die Seite angesehen und Dir folgendes Makro gebastelt. Im Kern solltest Du verstehen, wie Du an den gesuchten Wert kommst. Habe ich ausführlich erklärt. Das Makro ist ein lauffähiges Beispiel, dass Dir in einer Tabelle die Schiffsnamen inklusive Verlinkung auf die Schiffseite und die Anzahl der inaktiven Sterne liefert.
Sub GetShipData()
Dim url As String
Dim doc As Object
Dim nodeAllShips As Object
Dim nodeOneShip As Object
Dim shipName As String
Dim shipUrl As String
Dim sheetInUse As Worksheet
Dim currRow As Long
Set sheetInUse = ActiveWorkbook.ActiveSheet 'Bei Bedarf Anpassen
currRow = 1 'Bei Bedarf Anpassen
url = "https://swgoh.gg/p/231956643/ships/" 'Anpassen, ggf. mit in eine Schleife packen
Set doc = CreateObject("htmlFile")
With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send
If .Status = 200 Then
doc.body.innerhtml = .responseText
'Alle Schiffe auslesen
Set nodeAllShips = doc.getElementsByClassName("collection-ship")
'Alle Schiffe durchgehen
For Each nodeOneShip In nodeAllShips
'Schiffsname für die Zuordnung auslesen und Seite zum Schiff verlinken
'Die Ausgabe erfolgt in der oben angegebenen Tabelle und in der oben angegeben Zeile in Spalte 1
shipName = nodeOneShip.getElementsByClassName("collection-ship-name")(0).innertext
shipUrl = nodeOneShip.getElementsByClassName("collection-ship-name")(0).getElementsByTagName("a")(0).href
shipUrl = Replace(shipUrl, "about:/", "https://swgoh.gg/")
sheetInUse.Hyperlinks.Add Anchor:=Cells(currRow, 1), Address:=shipUrl, TextToDisplay:=shipName
'Der gesuchte Wert kann einfach ermittelt werden, indem eine Node Collection über die Klasse
'ship-portrait__star--inactive gebildet wird. Diese ist in den nicht gewünschten Sternen nicht
'vorhanden. Das funktioniert, weil mit getElementsByClassName() jede der angegebenen Klassen für
'sich abgefragt werden kann. Die Klassen sind meistens durch Leerzeichen voneinander getrennt.
'Die Node Collection wird in jedem Fall gebildet, auch wenn die abgefragte Klasse nicht gefunden
'wird. In dem Fall enthält die Node Collection keine Elemente, womit Length den Wert 0 liefert.
'Die Ausgabe erfolgt in der oben angegebenen Tabelle und in der oben angegeben Zeile in Spalte 2
sheetInUse.Cells(currRow, 2) = nodeOneShip.getElementsByClassName("ship-portrait__star--inactive").Length
currRow = currRow + 1
Next nodeOneShip
Else
MsgBox "Seite konnte nicht geladen werden. HTML status: " & .Status
End If
End With
End Sub
Viele Grüße,
Zwenn