dポイントプレゼントキャンペーン実施中!

ieやエッジを使用すれば簡単なのですが、ブラウザを使用したくないので別の方法を考えています。

次のurlの様にクラスAAAAAの下にいくつかクラスがあり、そのクラスにinnerTextが2つあります。
 
 やりたいことは、AAAAAで絞って、その配下のクラスのtextクラスのinnerHtmlのみを取得したいのですが、詳しい方教えてください。

 まとめて取得して半角空白以前を抜き出せばよいという考えもありますが、今回はどうしてもクラスtextをスポットで抜き出したいのでよろしくお願いいたします。


<url>

<ul class="AAAAA">
<label>
<input type="checkbox">

<span>
<span class="flag"></span>
<span class="text" aria-hidden="true">21</span>

</span>

<span class="count">52</span>
</label>
</li>
<li class="facet">
<label>
<input type="checkbox">

<span>
<span class="flag"></span>
<span class="text" aria-hidden="true">21.5</span>

</span>

<span class="count">33</span>
</label>
</li>


以下:同じ


試験中モジュール

Set httpClient = CreateObject("WinHttp.WinHttpRequest.5.1")

httpClient.Open "GET", ページ, False
httpClient.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
httpClient.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
httpClient.setRequestHeader "Upgrade-Insecure-Requests", 1
httpClient.send (Null)

'Dim htmDoc As MSHTML.HTMLDocument
'Set htmDoc = New MSHTML.HTMLDocument
'htmDoc.body.innerHTML = httpClient.responseText


'見本
Dim 要素 As MSHTML.HTMLDocument
Set 要素 = New MSHTML.HTMLDocument

要素.body.innerHTML = httpClient.responseText

Dim objClass As Object



For Each objClass In 要素.getElementsByClassName("AAAAA")

Debug.Print objClass.innerText


Next


Stop





実行結果

21 52
21.5 33

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

  • うーん・・・

    ありがとうございます。
    textのクラスは他にも使われており、objClass.getElementsByClassName("text")だけで取得すると
    別のクラスのtextも採ってきてしまいます。

    なので一度AAAAAクラスで絞って、その中のクラスtextを取得したいのです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/03/03 12:43
  • No1の回答者さまの意見を実行しましたが、エラーになりましたので補足でつけておきます。
    objclassをDOM形式にまとめないといけいのでしょうか?
    何かうまくDOMが理解できるものに変換する方法をしっている人はいませんか?

    For Each objClass In 要素.getElementsByClassName("facets facet-SIZE_SCHEME_SHOESIZE")

    Debug.Print objClass.getElementsByClassName("text").innerText

    Debug.Print 要素1.innerText

    Next

    Debug.Print objClass.getElementsByClassName("text").innerText
     の箇所が黄色くなり、添付のメッセージが起動されます。

    「エクセル vbaに詳しい方 お願いします」の補足画像2
      補足日時:2018/03/03 13:00

A 回答 (3件)

素朴な疑問なのですが、この簡易的な方法って、HTML解析待ちが要らないのでしょうか。



要素.body.innerHTML = httpClient.responseText
While 要素.readyState <> "complete"
Sleep 1
Wend

―――

一般的には、IPersistStreamInit::Load を用いる。
https://gist.github.com/kumatti1/485df5eaeaa43d3 …
    • good
    • 0

No1です。



>No1の回答者さまの意見を実行しましたが、エラーになりました
getElementsByClassNameで取得できるのは要素リスト(配列に似たオブジェクト)のはずです。(一応、メソッド名が複数形になっていますし)
最初にご提示のコードではその様に扱っているので、今更、説明は不要と思ったのですが……

エラーメッセージの雰囲気では、要素(群)は取得できているような感じですが?
    • good
    • 0

こんにちは



よくわかってませんけれど、objClassが取得できているのなら、再度
 objClass.getElementsByClassName("text")
などで絞りこめばよいだけでは?

あるいは、querySelectorやquerySelectorAllが使えるのなら、ダイレクトに要素が取得できるものと思われます。
この回答への補足あり
    • good
    • 0

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