VBS/VBAを使用してWebページからデータをスクレイピングして遊んでいます。HTMLElementの代わりにHTMLElementのgetElementByIdを使用します。
もし私が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
私はそれは、文書のフラグメントのようなものですが、そのどちらかで動作するか、単に私が
Dim Fragment As HTMLDocument
Set Element = Document.getElementById("example") ' This works
Set Fragment = Element.document ' This doesn't
をどう思うかイマイチするのが難しいが、これも思える場合見て、HTMLElement.document
プロパティを見てきましたそれを行うために長い風に吹かれた方法(しかし、それは通常vbaのための方法ですが)。 機能をチェーンする簡単な方法があれば誰でも知っていますか?
Document.getElementById("target").getElementsByTagName("tr")
は素晴らしいだろう...
:これはIE8で動作するためには、あなたが探しているオブジェクトあなたのクラス名の前にドットで、querySelectorAllを使用します'javascript:' urlに移動します。働いたが、あまりうまくいかなかった。 'Document.parentWindow.ExecScript'がブロックしているかどうか知っていますか?結果が設定される前にスクリプトが実行を終了しない可能性がありますか? (秒も自分自身をテストします)。私はまだ純粋にVBでそれを行う方法があるかどうかを知りたいです! – NickSlash
これは、querySelectorがIE9 + dllで動作しないとは限りません。私はそれらをテストしていません。 – mkingston
@NickSlash私はあなたのコメントに答えるために私の答えを編集しました。ブロッキングに関してはそうだと思いますが、私は確信していません。かなり簡単にテストすることができます(ネストされたループの数は2^31まで、または整数の最大値はJSにあります)。 – mkingston