Bawiłem się ze skrobaniem danych ze stron internetowych przy użyciu VBS/VBA.Użyj getElementById na HTMLElement zamiast HTMLDocument
Gdyby to był Javascript, nie byłoby mi łatwo, ale nie wydaje się być tak proste w VBS/VBA.
Oto przykład, który zrobiłem dla odpowiedzi, działa, ale planowałem dostęp do węzłów potomnych przy użyciu getElementByTagName
, ale nie mogłem dowiedzieć się, jak z nich korzystać! Obiekt HTMLElement
nie ma tych metod.
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
czekałem na miejscu HTMLElement.document
, sprawdzając, czy jest to jak fragment dokumentu, ale jest też trudne do pracy lub po prostu isnt co myślę
Dim Fragment As HTMLDocument
Set Element = Document.getElementById("example") ' This works
Set Fragment = Element.document ' This doesn't
Wydaje się to również długi sposób, aby to zrobić (chociaż to zwykle sposób dla vba imo). Ktoś wie, czy istnieje prostszy sposób na łańcuchowe funkcje?
Document.getElementById("target").getElementsByTagName("tr")
byłoby super ...
dam, że Go, próbowałem coś podobnego, przejdź do mojej strony następnie przejdź do adresu URL 'javascript:'. pracował, ale niezbyt dobrze. Czy wiesz, czy 'Document.parentWindow.ExecScript' jest blokowany? lub czy mój skrypt nie może zostać zakończony przed ustawieniem wyniku? (sprawdzę się też za chwilę). Nadal chciałbym wiedzieć, czy istnieje sposób, aby zrobić to wyłącznie z VB! – NickSlash
To nie znaczy, querySelector nie będzie działał z bibliotekami IE9 +, po prostu nie przetestowałem tych – mkingston
@NickSlash Edytowałem swoją odpowiedź, aby odpowiedzieć na twój komentarz. Jeśli chodzi o blokowanie, tak myślę, ale nie jestem pewien. Powinien być dość łatwy do przetestowania (kilka zagnieżdżonych pętli liczących do 2^31 lub cokolwiek, co całkowita liczba całkowita jest w JS). – mkingston