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

どなたかご教示ください。
Webサイトのセレクトボックスを操作するコードを記述しようとしています。
Elementを取得するためのコードを試しているのですが、
Webページの途中までのElementしか取得できません。
getElementsByTagName、~Name、all~など色々試してみましたが、
表の「決算期」以下の行のセレクトボックスを取得しません。
htmlソースを確認してもタグは全く同様に記述されています。
確認しているコードは以下の通りです。

大変恐縮ですが、なにとぞよろしくお願いいたします。

-----------------------------------------------------------------------------------------------
Sub sample()

Dim objIE As InternetExplorer
Dim htmlDoc As Object
Dim strUrl As String
Dim slt As Object '検索日付設定用

Set objIE = CreateObject("Internetexplorer.Application")

strUrl = "https://www2.tse.or.jp/tseHpFront/JJK010010Actio … 'ページのURL

objIE.navigate strUrl

Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop

Set htmlDoc = objIE.document

'決算期より下の行が取得できない・・・
For Each slt In htmlDoc.getElementsByTagName("select")
Debug.Print slt.outerHTML
Next

MsgBox "終わり"

End Sub

質問者からの補足コメント

  • 該当のWebサイトのページはこちらです。

    https://www2.tse.or.jp/tseHpFront/JJK010010Actio …

      補足日時:2020/04/01 21:06
  • fujillinさま、ご回答誠にありがとうございます。
    説明不足な点がございました、大変申し訳ございません。

    事象の発生した画面は「詳細検索」をクリックし、
    「詳細検索」画面を表示した状態です、画面添付します。
    ※自分はVBAコードに埋めたリンクで「詳細検索」画面を開きますが、
     何度かボタンで開いているためCookieに保存されているせいでしょうか。
     申し訳ございませんがURLの「jsessionid~」のため簡易検索になると思います。

    「詳細検索」画面のhtmlソースで「決算期」より下の<select>や<option>タグが確認できるのに、
    何故か「8タグしか」拾ってこないという現象です。
    「簡易検索」「詳細検索」の境目が原因と考えては見たのですが、
    htmlソースを見る限り、境目に特別な記述は見られません。

    お手数をおかけいたしますが、よろしくお願いいたします。

    「WebサイトのHTMLオブジェクトの取得」の補足画像2
    No.1の回答に寄せられた補足コメントです。 補足日時:2020/04/02 11:12
  • うーん・・・

    fujillinさま、何度もありがとうございます。

    >実際にVBAが開いている画面を確認....
     今回の確認用コードでは考えが及んでいませんでした、未熟です。
     但し、現象を認知した元のプロシージャでは以下のコード
      For Each objLink In objIE.document.Links
    If InStr(objLink.outerHTML, "詳細検索") > 0 Then
    objLink.Click
    Exit For
    End If
    Next
     で詳細検索画面を開いてElement取得を試みてダメでした。

    >javascriptの「changeTab()」関数が呼び出されて....
     当初からjavascriptは疑いましたが何分知識がなく、諦めます..

    ご回答心より感謝申し上げます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/04/02 13:35

A 回答 (4件)

No2です



>で詳細検索画面を開いてElement取得を試みてダメでした
ご提示のコードで詳細画面は開くと思いますが、そのまま要素の取得をしようとすると失敗するはずです。
なぜなら、ajaxなどの処理を行っているとするならば、クリックしてからブラウザはサーバと通信して内容を書き換えるという手順を踏んでいるはずなので、クリック直後にはまだ求める内容が存在しないからです。

最初にブラウザを表示する時の
 DoEvents
の表宇待ちのようなルーチンが必要になります。

仕組みを確認してはいませんのでわかりませんが、ajaxなどの場合はドキュメントが書き換わるわけではありませんので、objIEのstatusをチェックするのではうまくいかないはずです。
何らかの要素の状態を監視すれば良いのかもしれませんし、あるいは、単純に求める要素が追加されるのを待つというロジックでも良いかも知れません。

あるいは、javascriptを解析すれば、直接VBAからサーバにリクエストして表示するという方法もあり得るかも知れません。(サーバサイドのチェック内容にもよりますが)
    • good
    • 0
この回答へのお礼

「詳細検索」クリック後に、DoEventsで待機を入れることで解決しました。
ajax/javascriptが原因なら諦めるところでしたが、何とか理解できる原因でよかったです。
心より感謝・お礼申し上げます。

表の上半分(簡易検索部分)のセレクトやチェックはできていたものの、
更新された画面が表示できていなかったのでおかしいなとは思っていたのですが。
これも同じ原因だったんですね、①上半分の処理(OK)、②下半分のElement取得(空振り)、
の後で詳細検索画面が更新されていた...ということなんですね。

63歳で初めてプログラミングを勉強して1年ちょっとの初心者です。
改めまして、感謝感謝感謝です、ありがとうございました。

お礼日時:2020/04/02 15:29

No3です



例えば、通信終了まで固定時間待つというものなら簡単に作成できます。
(ただし、固定時間という点が柔軟性にかけますが・・・)

No2に以下のコードに追加して、新しいセレクト要素をピックアップしてみました。
(ウェイトは固定で3秒程度にしてあります)

For i = 1 To 3
Application.Wait Now() + TimeValue("00:00:01")
DoEvents
Next i
Set htmlDoc = objIE.document
For Each slt In htmlDoc.getElementsByTagName("select")
Debug.Print slt.Name
Next

この結果、以下の14個のセレクト要素が取得されます。
(要素のName属性を列挙)
kssnHpuYtiDayFrmDayPd
kssnHpuYtiDayToYearPd
kssnHpuYtiDayToTskPd
kssnHpuYtiDayToDayPd
eqnsskKaisiDayFrmYearPd
eqnsskKaisiDayFrmTskPd
eqnsskKaisiDayFrmDayPd
eqnsskKaisiDayToYearPd
eqnsskKaisiDayToTskPd
eqnsskKaisiDayToDayPd
zmkkKjnKkPd
jirissPd
kizkKguZntCukPd
shiEqnsJkuPd
    • good
    • 0
この回答へのお礼

ホントにありがとございます。

作っておいた以下のサブを呼び出してうまくいきました。

Sub 待機()
  Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
   DoEvents
  Loop
End Sub

いただいたコードも勉強させていただきます。
ありがとうございました。

お礼日時:2020/04/02 15:37

No1です




>詳細検索」画面のhtmlソースで「決算期」より下の<select>や<option>タグが確認
>できるのに、何故か「8タグしか」拾ってこないという現象です。
別途に開いて確認したつもりになるのではなく、実際にVBAが開いている画面を確認なさった方が確実です。
・・・で、多分、実際に開いているのはNo1に添付したページと同じものだと想像します。

コード内で(最初のうちに)、
 objIE.Visible = True
としておけば、IEが表示されるはずです。(ご提示の内容だと非表示のまま)


ご提示のサイトの仕組みはきちんと調べていませんが、詳細検索ボタンをクリックするとjavascriptの「changeTab()」関数が呼び出されています。
その先の確認はしていませんが、元のソース内にそれらしきHTMはなさそうなので、ajax等でタブ切り替えをして表示しているのかも知れません。
仕組みを調べなくとも手っ取り早く表示するには、手操作を模して当該ボタンをクリックすることで、この方法でもお求めの画面は表示されるはずです。

例えば、単純に当該ボタンをクリックする例を以下にご参考までに。

Sub sample_2()
Dim objIE As Object, htmlDoc As Object

Const strUrl = "https://www2.tse.or.jp/tseHpFront/JJK010010Actio …
Set objIE = CreateObject("Internetexplorer.Application")

objIE.Visible = True
objIE.navigate strUrl

Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop

Set htmlDoc = objIE.document
htmlDoc.querySelector("div.pagecontents > form > ul > li:nth-child(2) > a").Click

End Sub
この回答への補足あり
    • good
    • 0

こんにちは



ご指定のページは添付図の様な内容です。
「決算期」とあるのは中央の表の最下行に当たると思いますが、それ以降にはフッターくらいしか記述されていません。

>'決算期より下の行が取得できない・・・
ご提示のコードを実行すると、以下の8つのセレクト要素が取得できます。
最後の2個が表中の決算期の行にあるセレクトですね。
これより下の行にはセレクト要素は存在しないと思いますけれど…?

<select name="dspJnKmkMiPd">
<select name="dspJnPd">
<select name="dspSsuPd">
<select name="hnsShzitPd">
<select name="gyshKbnPd">
<select name="bibiTniPd">
<select name="kssnKiPd">
<select name="kssnKi2Pd">
「WebサイトのHTMLオブジェクトの取得」の回答画像1
この回答への補足あり
    • good
    • 0

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