プロが教える店舗&オフィスのセキュリティ対策術

次のマクロは、ニコニコ動画のマイリストページを開き、動画の数を取得するVBScriptになります。

Dim objIE 'as Object
Dim Movies 'as integer
Set objIE = CreateObject("InternetExplorer.Application")

objIE.Navigate "http://www.nicovideo.jp/mylist/53973672"

Do until objIE.readystate=4
Wscript.Sleep 200
Loop

Movies = objIE.Document.GetElementsbyClassName("SYS_box_item").Length '動画の数を取得
msgbox Movies

objIE.quit
set objIE = Nothing

また添付図は、そのマイページのソースの一部になります。
ここで質問なのですが、同じクラス(今回はSYS_box_item)から、任意のn番目のタグIDを取得したい場合には、どのように記述すれば良いのでしょうか?

HTMLに詳しくないので、教えていただきたいです。

「VBSでのDOM操作について」の質問画像

A 回答 (2件)

ANo1です。



申し訳ないです。実は、VBSはほとんど知らないのですが、違ってたのかな?
・・・ってんで、慌ててにわか勉強しならテストしてみました。

ご提示のサイトには残念ながらアクセスできない環境からなので、違うページでテストしています。

Dim objIE, elms
Dim idx, res

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

objIE.Navigate "http://www.data.jma.go.jp/obd/stats/data/mdrr/sy …

Do Until objIE.readystate = 4
Wscript.Sleep 200
Loop

Set elms = objIE.Document.GetElementsbyClassName("o0")

res = ""
For idx = 0 To 10
res = res & elms(idx).innerText & " , "
Next

MsgBox "Length=" & elms.Length & vbCrLf & res

objIE.Quit
Set objIE = Nothing


※ 気象庁のページですが、表中、地名の欄にクラス名「o0」が付いています。
上記を実行すると、
 Length= 164
 札幌 , 稚内 , 北見枝幸 , 旭川 , 留萌 , 羽幌 , 岩見沢 , 小樽 , 寿都 , 倶知安 , 網走 ,
のように、表中の最初の11の地名が表示されます。

それなので、要素は取得できていると考えても良さそうです。
上の例では文字列を取得していて属性値ではないところが違うと言えば違いますが、上記の要素には他に属性値がないので、
 res = res & elms(idx).className & " , "
と、クラス名を取得してみると、(←バカバカしいですが)
 o0 , o0 , o0 ・・・・・
となりますので、予想通り属性値も取得できるようです。

ということで、こちらで試した範囲ではANo1でいけそうに思えるのですが・・・
何ぶんにもにわか勉強の者なので、どこかに間違いがあるのかも知れません。


>Lengthで要素の数が返ってくるのに、配列ではないということはあるのでしょうか?
GetElementsbyClassNameが返すものは、要素リスト(NodeList)と言われるもので、DOM要素と直結した「活きた」リストです。(純粋な配列とは違います)
読み出して使う範囲では、ほぼ配列と同じ扱いができたはずです。
<参考>
http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-2 …
    • good
    • 0

確認していませんが・・・



objIE.Document.GetElementsbyClassName("SYS_box_item")( index )
で対象となるDOM要素が取得できると思いますので、

objIE.Document.GetElementsbyClassName("SYS_box_item")(index).id
または
objIE.Document.GetElementsbyClassName("SYS_box_item")(index).getAttribute("id")
で、どうでしょうか?
    • good
    • 0
この回答へのお礼

回答有り難うございます

インデックス番号を付加して行ってみたのですが、両者とも「型が一致しません」というエラーを吐いてしまいました。
そもそも本当に配列なのかをみるために、isArrayを使って調べたら結果はFalseでした。Lengthで要素の数が返ってくるのに、配列ではないということはあるのでしょうか?

色々ハマってしまっている状態で、お知恵を貸していただきたいです。

お礼日時:2016/02/03 21:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!