おすなのぶろぐ

プログラミングとかの Tips 置き場。

HTML 内の URL 解析

HTML 内の URL を解析してみるテスト。とりあえず A タグの URL だけ Debug.Print してみる。

MSHTML を使った例

Public Sub FindAnchorUrl1(ByVal HtmlPath As String)
    Dim HtmlDocument As MSHTML.HtmlDocument
    Set HtmlDocument = New MSHTML.HtmlDocument

    Dim Html As MSHTML.HtmlDocument
    Set Html = HtmlDocument.createDocumentFromUrl(HtmlPath, vbNullString)

    Do
        ' 本来は Sleep を使うべき
        ' テスト用に作ったので仮で DoEvents を使用
        DoEvents

        If Html.readyState = "complete" Then
            Exit Do
        End If
    Loop While True

    Dim Anchors As IHTMLElementCollection
    Set Anchors = Html.getElementsByTagName("A")

    Dim Anchor As HTMLAnchorElement
    For Each Anchor In Anchors
        Debug.Print Anchor.href
    Next
End Sub

地道にテキストを解析した例

※テスト用に書いたコードそのままなので、
 リファクタリングはまったくしてないです。ご容赦。
 ちなみに、HTML ファイルはローカルにあるのを前提とします。

Private FileSystemObject As New FileSystemObject

Public Sub FindAnchorUrl2(ByVal HtmlPath As String)
    Dim Stream As TextStream
    Set Stream = FileSystemObject.OpenTextFile(HtmlPath)

    Dim Text As String
    Text = Stream.ReadAll()

    Dim Find As String
    Find = Strings.LCase$(Text)

    Dim i As Long
    i = 1

    Do
        Dim AnchorIndex As Long
        AnchorIndex = Strings.InStr(i, Find, "<a", vbBinaryCompare)

        If AnchorIndex <> 0 And AnchorIndex < Len(Text) Then
            Dim HrefIndex As Long
            HrefIndex = Strings.InStr(AnchorIndex, Find, "href=", vbBinaryCompare)

            If HrefIndex <> 0 And HrefIndex < Len(Text) Then
                Dim UrlIndex As Long
                UrlIndex = HrefIndex + Len("href=")

                If Strings.Mid$(Find, UrlIndex, 1) = """" Then
                    UrlIndex = UrlIndex + 1
                End If

                Dim UrlLast As Long
                UrlLast = Strings.InStr(UrlIndex, Find, """", vbBinaryCompare)

                If UrlLast = 0 Then
                    UrlLast = Strings.InStr(UrlIndex, Find, " ", vbBinaryCompare)
                End If

                If UrlLast = 0 Then
                    Debug.Print "URL 取得失敗。"
                    i = UrlIndex
                Else
                    Debug.Print Mid$(Text, UrlIndex, UrlLast - UrlIndex)
                    i = UrlLast
                End If
            Else
                Exit Do
            End If

        Else
            Exit Do
        End If
    Loop Until Len(Text) < i

    Call Stream.Close
End Sub

参考

Web ページをダウンロードする方法~ MSHTML 編~
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html