Ich habe mit Scraping Daten von Webseiten mit VBS/VBA gespielt.Verwenden Sie GetElementById auf HTMLElement anstelle von HTMLDocument
Wenn es Javascript wäre ich weg sein, wie es einfach ist, aber es scheint nicht ganz so einfach in VBS/VBA zu sein.
Dies ist ein Beispiel, das ich für eine Antwort gemacht, es funktioniert, aber ich hatte auf dem Zugriff auf die untergeordneten Knoten geplant getElementByTagName
verwenden, aber ich kann nicht herausfinden, wie sie zu benutzen! Das Objekt HTMLElement
verfügt nicht über diese Methoden.
Sub Scrape()
Dim Browser As InternetExplorer
Dim Document As HTMLDocument
Dim Elements As IHTMLElementCollection
Dim Element As IHTMLElement
Set Browser = New InternetExplorer
Browser.navigate "http://www.hsbc.com/about-hsbc/leadership"
Do While Browser.Busy And Not Browser.readyState = READYSTATE_COMPLETE
DoEvents
Loop
Set Document = Browser.Document
Set Elements = Document.getElementsByClassName("profile-col1")
For Each Element in Elements
Debug.Print "[ name] " & Trim(Element.Children(1).Children(0).innerText)
Debug.Print "[ title] " & Trim(Element.Children(1).Children(1).innerText)
Next Element
Set Document = Nothing
Set Browser = Nothing
End Sub
Ich habe am HTMLElement.document
Eigenschaft suchen, zu sehen, wenn es wie ein Fragment des Dokuments ist aber die entweder schwer zu verarbeiten oder ist nicht genau das, was ich denke,
Dim Fragment As HTMLDocument
Set Element = Document.getElementById("example") ' This works
Set Fragment = Element.document ' This doesn't
Dies scheint auch ein langatmigen Weg, es zu tun (obwohl das normalerweise der Weg für VBA Imo ist). Wer weiß, ob es eine einfachere Möglichkeit gibt, Funktionen zu verketten?
Document.getElementById("target").getElementsByTagName("tr")
wäre genial ...
Ich gebe, dass ein zu gehen, habe ich versucht, etwas Ähnliches zu meiner Seite navigieren dann Navigiere zu einer 'javascript:' URL. gearbeitet, aber nicht sehr gut. Weißt du, ob 'Document.parentWindow.ExecScript' blockiert? Oder könnte mein Skript nicht fertig ausgeführt werden, bevor das Ergebnis gesetzt ist? (testet mich auch in einer Sekunde). Ich würde immer noch gerne wissen, ob es einen Weg gibt, es nur mit VB zu machen! – NickSlash
Das soll nicht heißen, dass querySelector nicht mit den IE9 + dlls funktioniert, ich habe diese nicht getestet – mkingston
@NickSlash Ich habe meine Antwort bearbeitet, um auf Ihren Kommentar zu antworten. Was das Blockieren betrifft, denke ich, aber ich bin mir nicht sicher. Sollte ziemlich einfach zu testen sein (paar verschachtelte Schleifen zählen zu 2^31 oder was auch immer die ganze Zahl in JS ist). – mkingston