AW: Unterobj. von html getElements..() weiter parsen
23.09.2019 16:39:49
html
Hallo Ingo,
da ich annehme, es geht noch immer um die Jobseiten, gebe ich Dir mal ein Makro, in dem Du siehst, wie Du die aufzuklappenden Seiteninhalte anklickst. Ich habe das exemplarisch für die Kontaktdaten gemacht, weil diese Seiteninhalte nachladen und ich Dir da gleich mit zeigen kann, das an solchen Stellen eine manuelle Pause eingebaut werden muss.
Anschließend direkt die Demonstration, wie man an Inhalte kommen kann, wenn man nicht direkt auf das richtige Tag zugreifen kann. Zusätzlich der Trick, wie man mit getElementByID() in VBA umgehen muss.
Alles in allem ist das für Fortgeschrittene, aber da Du selber schon etwas ausprobiert hast, kannst Du es vielleicht nachvollziehen.
Die urlmon-Geschichte brauchst Du für Dein Vorhaben nicht. Die wird benötigt, wenn Du Dateien runterladen möchtest, die Du auf der Festplatte speichern willst. Z.B. Bilder von einer Seite. Das Speichern der HTML-Dateien brauchst Du für Deinen Zweck aber nicht.
Da Du auf Seiten zugreifst, die AJAX-Inhalte haben, an die Du ran musst, wirst Du den Internet Explorer nutzen müssen. Der kann mit JavaScript umgehen, was Du unbedingt brauchst. AJAX-Inhalte sind Teile einer Seite, die nachgeladen werden, wenn man etwas bestimmtes anklickt oder z.B. bei Facebook runterscrollt.
Ich hoffe Du kannst damit was anfangen:
(Die url musst Du wieder auf eine Zeile ziehen. Die ist so lang, dass die Forensoftware sie mehrfach umbricht. Die ParentNode-Zeile wird auch einmal umgebrochen.)
Sub JobAngebotKontaktdatenAuslesen()
'Für den Internetzugriff
Dim browser As Object
Dim url As String
Dim knotenWurzel As Object
Dim knotenStamm As Object
Dim knotenAst As Object
Dim adresse As String
url = "https://jobboerse.arbeitsagentur.de/vamJB/stellenangeboteFinden.html?execution=e2s1& _
_eventId_detailView&bencs=QFBrF0U0oHouAVZy%2BcgzlA%2FZD1%2FHs32Jn0ofKD5zPNsALGnhYCZhDoj8Iza0WZmT&bencs=PhdLA4E%2BZti4%2BR82eMYyAcr2f0es%2BqheKgN81DAVb8Zwu34FvGGarYrjx5XFt%2FOrdhxxOFAlOiPWqZazQUCgEg%3D%3D&bencs=Y7sCHM0u4zE4Urarmr5%2BLi9RnFDRlglOQtQilhdvkuimLwetFkU65Jm%2BMYEFCkBNC6MrBGXWadJCjLTenJ%2BnyZ5oSz5vrZLFUSO96PY2j2HZajvIMiyAbiAKXaPDg10c"
'Internet Explorer initialisieren, Sichtbarkeit festlegen,
'URL aufrufen und warten bis Seite vollständig geladen wurde
Set browser = CreateObject("internetexplorer.application")
browser.Visible = False 'Zum sichtbar machen auf True setzen
browser.navigate url
Do Until browser.ReadyState = 4: DoEvents: Loop
'Um die Kontaktdaten auszulesen, müssen sie auf der Seite ausgeklappt werden
'Es handelt sich um einen Link, der angeklickt werden muss
'Also sammeln wir zunächst alle Links in einer NodeCollection ein
Set knotenWurzel = browser.document.getElementsByTagName("a")
'Prüfen ob die NodeCollection gebildet werden konnte
If Not knotenWurzel Is Nothing Then
'Wenn ja, alle elemente der Collection durchgehen
For Each knotenStamm In knotenWurzel
'Wir suchen das HTML-Element für die Kontaktdaten
'Dieses Wort steht im Linktext, der auf der Seite angezeigt wird
If InStr(1, knotenStamm.innertext, "Kontaktdaten") > 0 Then
'Wenn das richtige Element in der NodeCollection gefunden wurde
'Aufklappen durch Anklicken auslösen
knotenStamm.Click
'Warten bis Seite neu geladen
'Hier durch manuelle Pause, da die Abfrage auf ReadyState
'schon auf 4 (was für "complete" steht) gesetzt ist
'Ich habe 3 Sekunden gewählt
Application.Wait (Now + TimeSerial(0, 0, 3))
'Die Schleife verlassen, da wir haben was wir wollen
Exit For
End If
Next knotenStamm
'Wir gehen davon aus, dass das Aufklappen funktioniert hat
'Da wir auf eine ID zugreifen, müssen wir die Fehlerbehandlung abschalten
'weil für getElementByID() keine NodeCollection gebildet wird, sondern
'direkt ein Laufzeitfehler angezeigt wird, wenn es die ID im HTML-Code
'nicht gibt
On Error Resume Next
'Die etwas kryptische ID sollte sich nach dem Aufklappen im Quelltext befinden
'(Ich habe die ID nur bei zwei verschiedenen Jobangeboten getestet)
'Das HTML-Element dazu enthält allerdings nur den Firmennamen. Um an die ganze
'Adresse zu kommen, müssen wir deshalb auf den Elternknoten zugreifen. Das ist
'ein p-Tag, welches die gesamte Adresse umschließt
Set knotenAst = browser.document.getElementByID("ruckfragenundbewerbungenan_-2147483648"). _
ParentNode
'Die Adresse übernehmen wir in die Variable Adresse, indem wir den auf der Seite
'lesbaren Text mit innertext in die String-Variable adresse schreiben
'HTML-Zeilenumbrüche und Codierungen für Sonderzeichen, wie deutsche Umlaute,
'werden automatisch richtig übernommen
adresse = knotenAst.innertext
'Da der kritische Part hier endet, schalten wir die Fehlerbehandlung wieder ein
On Error GoTo 0
End If
'Ausgelesene Kontaktadresse anzeigen
MsgBox adresse
'Aufräumen
browser.Quit
Set browser = Nothing
Set knotenWurzel = Nothing
Set knotenStamm = Nothing
Set knotenAst = Nothing
End Sub
Viele Grüße,
Zwenn