エクセルマクロ オンライン講座コメント紹介

コメント紹介
   └ エクセルマクロVBA「Web連携」
       └ エクセルマクロVBA「Web連携」DOM(Document Object Model)を使った解析_概要

エクセルマクロVBA「Web連携」DOM(Document Object Model)を使った解析_概要

[5723] 2016-02-07 17:03:44 伊久間博之さんからの投稿です。

こんにちは。いつもお世話になっております。

WinHttp Services 5.1を使ってとってきたDOMを使った解析についてわからないことがありますので質問させてください。
metaタグのコレクションが取得できません。


JR東日本から(http://www.jreast.co.jp/)から
metaタグを抜き出そうとして以下のコードを書きました。

Sub GetRequestSimple2()
    Dim url As String
    url = "http://www.jreast.co.jp/";

    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send
    
    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If
    
    'htmlをDOMとして取得する。そのための変数を宣言。
    Dim oHTml As New MSHTML.HTMLDocument
    oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得
    
    Debug.Print xh.GetAllResponseHeaders
    Debug.Print oHTml.body.innerHTML 'xh.ResponseText
    Range("B1").Value = xh.GetAllResponseHeaders
    Range("B2").Value = oHTml.body.innerHTML ' xh.ResponseText
    
    Dim oM As MSHTML.HTMLHeadElement
    For Each oM In oHTml.getElementsByTagName("meta")
        Debug.Print oM.outerHTML
        Debug.Print oM.innerHTML
        Debug.Print oM.innerText
    Next
End Sub


が、取得できません。
Range("B2").Value をみると<body>以下が出力されていますので
[code] oHTml.body.innerHTML = xh.ResponseText[\code]
の body を head にすればいいのではないかと予想して
[code] oHTml.head.innerHTML = xh.ResponseText[\code]
としてみましたが、実行時エラー600になってしまいます。

調べてみるとInternet Controlsによる取得方法はいくつかあり、その方法を試したところmetaタグを取得することができました。

しかし、WinHTTP Services 5.1による取得方法を見つけられず、質問させて頂きました。

どのようにすればmetaタグ、headないの要素を取得することができるのでしょうか?

 


[5733] 2016-02-08 23:33:51 小川慶一さんからの投稿です。

伊久間博之 さん:

htmlヘッダーの中身を MSHTML.HTMLDocument で取得する方法は僕も知らないのですよ。
いろいろ調べているのですが、なぜか見つけられないです。

ということで、文字列として取得して Instr 関数等を使ってガシガシ解析するのはどうでしょうか。

Sub GetRequestSimple_Header()
    Dim url As String
    url = "http://www.jreast.co.jp/";

    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send
    
    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If
    
    Dim s As String
    s = xh.ResponseText
    Debug.Print Left(s, 500) 'あくまでデモとして出力。実際にはもっとしっかり解析します。
    
End Sub


Instr関数を使って <meta を探し、 Instrrev関数を使って </head 探せば、その間に答欲しい文字列がいそうですね。

 


[5743] 2016-02-09 23:37:52 伊久間博之さんからの投稿です。

小川慶一 さん:

なるほど。そうなんですね。
ガシガシ解析するか、Internet Controlsを使って解析するか、状況に応じて使い分けてみることにします。
ありがとうございます。m(_ _)m

>伊久間博之 さん:
>
>htmlヘッダーの中身を MSHTML.HTMLDocument で取得する方法は僕も知らないのですよ。
>いろいろ調べているのですが、なぜか見つけられないです。
>
>ということで、文字列として取得して Instr 関数等を使ってガシガシ解析するのはどうでしょうか。
>
>
Sub GetRequestSimple_Header()
>    Dim url As String
>    url = "http://www.jreast.co.jp/";
>
>    Dim xh As New WinHttp.WinHttpRequest
>    xh.Open "GET", url, False
>    xh.send
>    
>    Dim sCode As String
>    sCode = xh.Status
>    If sCode <> 200 Then
>        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
>    End If
>    
>    Dim s As String
>    s = xh.ResponseText
>    Debug.Print Left(s, 500) 'あくまでデモとして出力。実際にはもっとしっかり解析します。
>    
>End Sub

>
>Instr関数を使って <meta を探し、 Instrrev関数を使って </head 探せば、その間に答欲しい文字列がいそうですね。
>

 


[5755] 2016-02-10 09:53:29 小川慶一さんからの投稿です。

伊久間博之 さん:

結局、ガシガシ解析するとしたら、基礎編、発展編1で学んだ知識も総動員ですね。
そして、伊久間は地味にスキルが定着している方なので「状況に応じてつかいわけられる」と言えるのが強みですね☆



>小川慶一 さん:
>
>なるほど。そうなんですね。
>ガシガシ解析するか、Internet Controlsを使って解析するか、状況に応じて使い分けてみることにします。
>ありがとうございます。m(_ _)m

 


まずはここから!スマホでも学べる無料動画講座

今なら先着30名限定で無料!定価4,800円の、初心者のためのエクセルマクロ動画講座。
  1. Excel 97~Excel 2016まですべて対応。動画本数20本、総再生時間2時間44分53秒
  2. PC, Mac, iPhone, iPad, Androidのお好みの環境で、いつでも好きなときに学べます。
2004年から10年間述べ3,000名以上に実施した研修の経験と実績を集約した講座です。
いますぐ無料で試してください。

トップへ