5-3HTMLタグ操作方法

(1)HTMLソース取得
  [1]HTMLソース全体の取得

HTMLソースを変数に代入
Dim objIE As Object    'XMLHTTPオブジェクト
Dim dthtml As String    'htmlソース

Sub HTMLソース取得()
Dim fal As String   'ファイル種類
Dim objIE As Object
Dim urlk As String  'HTMLパス

'ファイル指定
'ファイル指定
fal = "HTMLファイル(*.html;*.htm),*.html;*.htm"
fff = Application.GetOpenFilename(fal, , Title:="HTMLファイル指定")

If fff = "False" Then
   MsgBox "ファイルを指定して下さい"
   Exit Sub
End If

'過去データ削除
Worksheets("Sheet1").Select
    Cells.ClearContents
    Range("A1").Select
Set oHttp = CreateObject("Microsoft.XMLHTTP")
        oHttp.Open "GET", urlk, False
        oHttp.Send
        dthtml = StrConv(oHttp.responsebody, vbUnicode)
Call 正規標記確認

End Sub
・以降の「正規標記確認」プロシージャもここから呼び出している(記載はここだけ)

正規標記で検索オブジェクト
Sub 正規標記確認()
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")  'VBScript.RegExpオブジェクトをセット
    oReg.Pattern = "<[^<>]+?>" 		    ' 表示文字列のマッチパターンを取得します
    oReg.Global = True			  ' 全体を対象とする

    itmsu = oReg.Execute(dthtml).Count   '下記MatchesのMatcheオブジェクト(Item)数

        With oReg.Execute(dthtml) 'Executeは成功したマッチの Matchesコレクション オブジェクト
            For j = 0 To itmsu - 1     '0スタートであり個数は-1する
                Cells(j + 2, 1) = .Item(j) '取得したMatcheオブジェクトをシートへ表示
            Next
        End With
    Set oReg = Nothing           ’oRegオブジェクト終了 
    Set oHttp = Nothing           ’oHttpブジェクト終了  
End Sub
"<[^<>]+?>" ⇒ HTMLタグは<で始まり>で閉じるので、まず「 "<" で "<" で始まり、"[^<"、">]"、で<> のいずれでもない 1 文字以上の文字を含み(+は1文字以上であり、*の場合はゼロ個以上)、">" で終わる文字列を取得せよ」という意味。

正規標記確認を実行結果


本例は<○○>のHTMLタグ取得で
ありテキスト文字はマッチしない
ので省略となっている。


[2]テキストのみ抜き取り例(グループなし)
HTMLソース
Sub 正規標記確認()
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = ">[^<>]+<"
    oReg.Global = True

    itmsu = oReg.Execute(dthtml).Count
     With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j)
            Next j
    End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub
・上記のプロシージャはパターン指定以外は(1)と同じです。

・">[^<>]+<" ⇒ HTMLタグは<で始まり>で閉じるので、囲まれていない><を取り出せばそれがテキスト文となる。まず「 ">" で ">" で始まり、"[^<"、">]"、で<> のいずれでもない 1 文字以上の文字を含み(+は1文字以上であり、*の場合はゼロ個以上)、"<" で終わる文字列を取得せよ」という意味。


正規標記確認を実行結果


本例は">""<"もマッチ対象なので
">""<"も抽出します。



[3]テキストのみ抜き取り例(捕捉グループ使用)
前記(2)では">""<"も抽出してしまうので、本項は捕捉グループでテキストのみを取り出す例です。
HTMLソース
Sub 正規標記確認()
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = ">([^\s<>]+)+?<"
    oReg.Global = True

    itmsu = oReg.Execute(dthtml).Count
     With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j).SubMatches(0) '()でククッタ箇所取り出し
            Next j
    End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub

・パターン文字列内で(括弧)でククッタ箇所は、SubMatches コレクション(の先頭要素)として参照出来ので、本例はテキスト部を()をグループ指定した。他は(1)(2)と同じです。

・">([^\s<>]+)+?<" ⇒ 「 ">" で ">" で始まり、"[^\s<"、">]"、で<> のいずれでもなく、"\s"でスペースや改行などの空白文字も対象外の、1 文字以上の文字を含み、"<" で終わる文字列を取得。」という意味。

・"+?<"の?がない場合は最長マッチングで、後戻りして"<"を探すので?は高速化を考えた場合あった方がいい(本例の場合は?がなくともテキスト抽出の結果は同じになります)


正規標記確認を実行結果


(2)リンク関連タグの検索例
 [1]ハイパーリンクの取得
正規標記で検索プロシージャ
Sub 正規標記確認()       '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")       'VBScript.RegExpオブジェクトをセット
    oReg.Pattern = "<a hrefa href=[^>].+?</a>"   '(表示上&lt;記述であり半角<に直すこと)
    oReg.Global = True                              'oRegオブジェクト全体を対象とする

    itmsu = oReg.Execute(dthtml).Count           '下記MatchesのMatcheオブジェクト(Item)数
     With oReg.Execute(dthtml)'Executeは成功したマッチの Matchesコレクション オブジェクト
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j)       '取得したMatcheオブジェクトをシートへ表示
            Next j
    End With
    Set oReg = Nothing		 	’oRegオブジェクト終了 
    Set oHttp = Nothing			’oHttpオブジェクト終了 
End Sub
・"<a hrefa href=[^>].+?</a>"⇒"<a hrefa href="で始まり、">"でない 1 文字以上の文字を含み、"</a>" で終わる文字列を取得。

・a href=[^>].+? でも a href=.+? でも結果は同じ

・?</a>が?</a>となり?がない場合は、<a href=...></a><a href=...></a>と続けて書いてあった場合?なない場合は最後まで行って後戻りして</a>を探すので、連続状態の抽出となり異なります。

正規標記確認を実行結果
画像クリックでリンクの場合は
文字がないので抽出されない


[2]すべてのリンクを検索
正規標記で検索プロシージャ
Sub 正規標記確認()    '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "(?:href|src).+?>"
    oReg.Global = True

    itmsu = oReg.Execute(dthtml).Count
     With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j)
            Next j
    End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub

"(?:href|src).+?>"⇒"href"又は"src"で始まり、1 文字以上の文字を含み">"で終わる文字列を取得。

正規標記確認を実行結果


[3]リンクのテキスト文字の取り出し
正規標記で検索プロシージャ
Sub 正規標記確認()
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "href[^>]+>(.+?)?</a>"
    oReg.Global = True

    itmsu = oReg.Execute(dthtml).Count
     With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j).SubMatches(0) 'テキストを捕捉グループで取得
            Next j
    End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub
"href[^>]+>(.+?)?</a>"⇒"href"で始まり、">"でない 1 文字以上の文字を含み">"で終わるタグで、その後ろの1 文字以上の文字を、</a>"が出現するまで(括弧)でくくって捕捉グループとして取得する。

正規標記確認を実行結果


(3)テーブル関連タグの検索例
正規標記で検索プロシージャ
Sub 正規標記確認()    '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String
Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "<table[^>]+>"
    oReg.Global = True
    oReg.IgnoreCase = True                          '大文字小文字を区別しない
    
    ken1 = oReg.Execute(dthtml).Item(0).FirstIndex '<tableの文字位置取得
    
    oReg.Pattern = "</table>"         
    ken2 = oReg.Execute(dthtml).Item(0).FirstIndex '</table>の文字位置取得
    
    dthtml2 = Mid(dthtml, ken1, ken2 - ken1)    'テーブル内の文字を変数dthtml2へ代入
    
    oReg.Pattern = ">([^\s<>]+)+?<"		      '">?<間のパターン設定
    
    itmsu = oReg.Execute(dthtml2).Count    '下記MatchesのMatcheオブジェクト(Item)数
        ra = 1: ca = 1
        With oReg.Execute(dthtml2)
            For j = 0 To itmsu - 1
                Cells(ra, ca) = .Item(j).SubMatches(0) 'Matcheオブジェクトをシートへ表示
                    ca = ca + 1
                If ca > 10 Then
                     ra = ra + 1: ca = 1       'セルの行列補正
                End If
            Next j
        End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub
・本例の場合<table>○○○</table>の○○○を取得して、そのデータを処理すればよいが、色々確認したが上手くマッチせず結局下記のようにHTMLソースの文字位置から、VBAのMid関数で○○○を取得した。

・"<table[^>]+>"⇒"<table"で始まり、">"でない 1 文字以上の文字を含み、"<>" で終わる文字列を取得。
("oReg.Execute(dthtml).Item(0).FirstIndex"でHTMLソースの<table文字の文字位置を取得)

・"</table>"⇒"</table>"の文字列を取得。 ("oReg.Execute(dthtml).Item(0).FirstIndex"でHTMLソースの"</table>"文字の文字位置を取得)

・">([^\s<>]+)+?<" ⇒ 「 ">" で ">" で始まり、"[^\s<"、">]"、で<> のいずれでもなく、"\s"でスペースや改行などの空白文字も対象外の、1 文字以上の文字を含み、"<" で終わる文字列を取得。」という意味。(テーブルデータ取得)

・".Item(j).SubMatches(0) "捕捉グループ(テーブルデータ)をセルへ記入。なお本テーブルは10列であり、10データ毎に列と行の操作(ra = ra + 1: ca = 1)をしている。

正規標記確認を実行結果


(4)各種HTMLタグ検索例1
[1]Webに表示されないメタ情報の取得
正規標記で検索プロシージャ
Sub 正規標記確認()   '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "<meta(.+)?>"

    oReg.Global = True
    oReg.IgnoreCase = True

    itmsu = oReg.Execute(dthtml).Count
        With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j).SubMatches(0)
            Next
        End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub
"<meta(.+)?>"⇒"<meta"で始まって、">"で終わるタグのテキストを含む部分を捕捉グループで取得
正規標記確認を実行結果


[2]Webに表示されないコメントの取得
正規標記で検索プロシージャ
Sub 正規標記確認()     '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer
Dim tst As String

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "<!(?:--)([^<>]+).+?(?:-)>"

    oReg.Global = True
    oReg.IgnoreCase = True

    itmsu = oReg.Execute(dthtml).Count
        With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j).SubMatches(0)
            Next
        End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub
"<!(?:--)([^<>]+).+?(?:-)>"⇒"<!"で始まり">"で終わるタグにマッチするが、"<!--"は"<! --"のように空白があってもタグの書き方としては問題ないようなので、"--"は"(?:--)"で別枠でマッチするように設定した。その後ろの"([^<>]+)"で"<>"以外が1文字以上(テキスト)を取得

正規標記確認を実行結果


[3]メールアドレスの取得
正規標記で検索プロシージャ
Sub 正規標記確認()     '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "(\w+)@(\w+)\.(\w+)"

    oReg.Global = True
    oReg.IgnoreCase = True

    itmsu = oReg.Execute(dthtml).Count
        With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j)
            Next
        End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub
"(\w+)@(\w+)\.(\w+)"⇒[a-zA-Z_0-9]の文字が1個以上あり、次が"@"で、次が[a-zA-Z_0-9]の文字が1個以上あり、次が"."で次が[a-zA-Z_0-9]の文字が1個以上を取得。

正規標記確認を実行結果


[4]更新日付の取得
正規標記で検索プロシージャ
Sub 正規標記確認()      '←6項のHTMLソース取得()プロシージャから呼び出し
Dim oReg As Object
Dim itmsu As Integer

Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = "\d+/\d+/\d+"

    oReg.Global = True
    oReg.IgnoreCase = True

    itmsu = oReg.Execute(dthtml).Count
        With oReg.Execute(dthtml)
            For j = 0 To itmsu - 1
                Cells(j + 1, 1) = .Item(j)
            Next
        End With
    Set oReg = Nothing
    Set oHttp = Nothing
End Sub

"\d+/\d+/\d+" ⇒0〜9の数字の文字が1個以上あり、次に"/"があって、次に0〜9の数字の文字が1個以上あり、次に"/"があって、次に0〜9の数字の文字が1個以上を取得。

"[0-9]+/\d+/\d+"⇒"\d"と[0-9]は同じ意味なのでこのように記述しても結果は同じです。

"\d{2,4}/\d{1,2}/\d{1,2}"⇒こちらも結果は同じですが意味は、0〜9の数字文字が2個以上4個以内で、次に"/"があって、次に0〜9の数字文字が1個以上2個以内で、次に"/"があって、次に0〜9の数字文字が1個以上2個以内を取得。文字数を指定している分だけ上記より精度が高い。ただし、20078と年の記述が誤って5桁の場合マッチしないのではなく0078と4桁を拾ってしまうのでこのケースでは文字数を指定してもあまり意味がない。

正規標記確認を実行結果


【ホ−ム】

【戻る】    【Top画面】   【HPへ】