【簡単】VBAとIEでページ内の商品情報(div)を順番にすべて取り出す方法
VBAを用いてIEを動かし、HTMLの情報を持ってくることに慣れてくると、
Div
の内容を書き出したいという要望が出てくると思います。
というのも、「DIV」とは、単体では特に意味を持たないタグですが、
<div>で囲った部分をブロックレベル要素としてグループ化することができるタグになっています。
グループ化することで、
・水平方向の位置をまとめて指定したり、
・指定した範囲にスタイルシートを適用したりすることができる
ため、商品の情報などは、divタブに囲まれていることが多々あります。
例えば、楽天の商品ですが、下記のように、
div でグループ化されており、
class="dui-card searchresultitem"が紐づけられています。
ですので、商品情報を持ってきたい場合、
classnameが、"dui-card searchresultitem"のdivの内容順番に取り出すて行くことで、
表示されているページの、商品情報の一覧を得ることができます。
コードサンプル
コードのサンプルとして、
「ふるなび」のあるページの商品情報を持ってくるコードを書いてみました。
ふるなびの場合、"product-info"がクラスネームになっておりますので、
・If A.className = "product-info" Then (product-infoだった場合、)
・For Each B In A.ALL (div内の要素を取りだし)
・YOUSO(i + 1, J) = B.INNERTEXT (innertextを配列に格納)
最後にエクセル内に書き出すことで、商品情報一覧を書き出しています。
Sub IEoutput2()
Application.ScreenUpdating = False
'IEの起動
Dim objIE As Object
Set objIE = GetObject("", "InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://furunavi.jp/Product/Search?subcategoryid=164,165,166,167,168&categoryid=17&order=3&layout_toggle=2&pagesize=100" ' このURLを任意に変更
' ページの表示完了待ち。
While objIE.ReadyState <> 4 Or objIE.Busy = True
DoEvents
Wend
On Error Resume Next '値がないとエラーが出るので、エラー回避用
i = 1 '開始行を指定
J = objIE.document.ALL.Length '要素の数を知る
Dim A As Object
Application.Wait Now() + TimeValue("00:00:03")
Dim YOUSO(10000, 0 To 14) As String
J = 0
For Each A In objIE.document.getElementsbytagname("*")
If A.className = "product-info" Then
For Each B In A.ALL
YOUSO(i + 1, J) = B.INNERTEXT
J = J + 1
Next
J = 0
i = i + 1
End If
Next
Range(Cells(2, 2), Cells(i, 15)) = YOUSO
Cells.WrapText = False
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
重要な要素を簡単に説明
特に難しいところはないと思いますが、特定のページを立ち上げた後、
まずは、
For Each A In objIE.document.getElementsbytagname("*")
で、HTMLのすべての要素を検索しに行っています。
その中で、classnameが特定の値であった場合、分岐させて、
For Each B In A.ALL
で次はdivの中身を検索しに行っています。
中身の情報は、
divごとに行を分け、
列方向に、情報を書き出していっています。
まとめ
このコードを覚えることで、
様々なサイトの商品情報などを簡単にまとめることができます。
ぜひ一度試してみてください。
その他、VBAでIEを動かすために必要な情報をまとめています!!
コメント欄