我一直在玩弄使用VBS/VBA從網頁上抓取數據。在HTMLElement上使用getElementById而不是HTMLDocument
如果是Javascript,我會遠離它,但它在VBS/VBA中看起來並不那麼直截了當。
這是我爲一個答案做的一個例子,它的工作原理,但我曾計劃使用getElementByTagName
訪問子節點,但我無法弄清楚如何使用它們! HTMLElement
對象沒有這些方法。
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
我一直在尋找的HTMLElement.document
性能,看它是否是像文件的一個片段,但其無論是困難的工作,或只是心不是我所想的
Dim Fragment As HTMLDocument
Set Element = Document.getElementById("example") ' This works
Set Fragment = Element.document ' This doesn't
這也似乎是一個囉嗦的方式來做到這一點(雖然這通常是vba imo的方式)。 任何人都知道是否有一種更簡單的方法來鏈接功能?
Document.getElementById("target").getElementsByTagName("tr")
將是真棒......
我給一個去,我想類似的東西,瀏覽到我的網頁,然後導航到一個'javascript:'url。工作,但不是很好。你知道'Document.parentWindow.ExecScript'是否阻塞嗎?或者可能我的腳本在結果設置之前沒有完成執行? (也會在一秒鐘內測試自己)。我仍然想知道是否有一種方法可以純粹用VB來完成它! – NickSlash 2013-03-03 23:49:53
這並不是說querySelector不能與IE9 + dll一起工作,我只是沒有測試過那些 – mkingston 2013-03-03 23:50:44
@NickSlash我編輯了我的答案以迴應您的評論。至於阻擋,我認爲是這樣,但我不確定。應該很容易測試(嵌套循環計數到2^31或JS中的最大整數)。 – mkingston 2013-03-04 00:02:05