简体   繁体   中英

VBA HTML Tag Hierarchy

A simple question. I am trying to write a procedure to parse the HTML of this Site

A part of the source code (lines 154 to 174) that is sufficient for a paradigm is:

<p>(British Aircraft Company)</p>
<ul>
<li><a href="/wiki/B.A.C._I" title="B.A.C. I" class="mw-redirect">B.A.C. I</a></li>
<li><a href="/wiki/B.A.C._II" title="B.A.C. II" class="mw-redirect">B.A.C. II</a></li>
<li><a href="/wiki/B.A.C._III" title="B.A.C. III" class="mw-redirect">B.A.C. III</a></li>
<li><a href="/wiki/B.A.C._IV" title="B.A.C. IV" class="mw-redirect">B.A.C. IV</a></li>
<li><a href="/wiki/B.A.C._V" title="B.A.C. V" class="mw-redirect">B.A.C. V</a></li>
<li><a href="/wiki/B.A.C._VI" title="B.A.C. VI" class="mw-redirect">B.A.C. VI</a></li>
<li><a href="/wiki/B.A.C._VII" title="B.A.C. VII" class="mw-redirect">B.A.C. VII</a></li>
<li><a href="/wiki/B.A.C._VII_Mk.2" title="B.A.C. VII Mk.2" class="mw-redirect">B.A.C. VII Mk.2</a></li>
<li><a href="/wiki/B.A.C._VII_Planette" title="B.A.C. VII Planette" class="mw-redirect">B.A.C. VII Planette</a></li>
<li><a href="/wiki/B.A.C._VIII" title="B.A.C. VIII" class="mw-redirect">B.A.C. VIII</a></li>
<li><a href="/wiki/B.A.C._VIII_Bat-Boat" title="B.A.C. VIII Bat-Boat" class="mw-redirect">B.A.C. VIII Bat-Boat</a></li>
<li><a href="/wiki/B.A.C._IX" title="B.A.C. IX" class="mw-redirect">B.A.C. IX</a></li>
<li><a href="/wiki/B.A.C._Cupid" title="B.A.C. Cupid" class="mw-redirect">B.A.C. Cupid</a></li>
<li><a href="/wiki/B.A.C._Drone" title="B.A.C. Drone" class="mw-redirect">B.A.C. Drone</a></li>
<li><a href="/wiki/B.A.C._Super_Drone" title="B.A.C. Super Drone" class="mw-redirect">B.A.C. Super Drone</a></li>
<li><a href="/wiki/B.A._Swallow_2" title="B.A. Swallow 2" class="mw-redirect">B.A. Swallow 2</a></li>
<li><a href="/wiki/B.A._Eagle_2" title="B.A. Eagle 2" class="mw-redirect">B.A. Eagle 2</a></li>
<li><a href="/wiki/B.A._Double_Eagle" title="B.A. Double Eagle" class="mw-redirect">B.A. Double Eagle</a></li>
</ul>

I am in the process of trying to engineer something out. So i can get to the <p> HTML Tag but i cannot tap on the list items to loop out what i want because they are further enclosed between the <ul></ul> tags . What would be your next steps?

Sub ICE()

Set Results = IE.document.getElementsByTagName("p")

For Each itm In Results
    If itm.innerHTML = "(British Aircraft Company)" Then




    End If
Next itm

End Sub

For a more concise picture this stage of my study is based on the answer at VBA parsing of href provided by ron

Recomendation by user Doug Glancy

--> It might be helpful to mention the desired results.

What i want is to have the capability to make VBA to 'click' on runtime the href of my preference since it is an actual link. I am studying code from ron on that which is (and can be seen in the previous example ):

If itm.outerhtml = "B.A.C. VII" Then
        itm.Click

        Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop
        Exit For
 End If

...here outerHTML is being used however the nucleus of my effort is the loop and the logical operator


I wrote this piece of code however it does not work

Set Results = IE.document.getElementsByTagName("p")

For Each itm In Results
    If itm.innerHTML = "(British Aircraft Company)" Then
        Set Results2 = IE.document.getElementsByTagName("ul")
        For Each itm2 In Results2
            If itm2.innerHTML = "B.A.C. V" Then
                MsgBox itm2.innerHTML
            End If

        Next itm2
    End If
Next itm

This will list out the aircraft under the p tag with British Aircraft Company

Sub GetAircraft()

    Dim xHttp As MSXML2.XMLHTTP
    Dim hDoc As MSHTML.HTMLDocument
    Dim hUls As MSHTML.IHTMLElementCollection
    Dim hUl As MSHTML.HTMLListElement
    Dim hLi As MSHTML.HTMLLIElement

    Set xHttp = New MSXML2.XMLHTTP
    xHttp.Open "GET", "http://en.wikipedia.org/wiki/List_of_aircraft_%28B%29"
    xHttp.send

    Do
        DoEvents
    Loop Until xHttp.readyState = 4

    Set hDoc = New HTMLDocument
    hDoc.body.innerHTML = xHttp.responseText
    Set hUls = hDoc.getElementsByTagName("ul")

    'Go through all the <ul> tags
    For Each hUl In hUls
        'Only if previous tag is something
        If Not hUl.PreviousSibling Is Nothing Then
            'Only if previous tag is <p>
            If TypeName(hUl.PreviousSibling) = "HTMLParaElement" Then
                'Only if previous paragraph is specified text
                If hUl.PreviousSibling.innerText = "(British Aircraft Company)" Then
                    'loop through the <li> and print them out
                    For Each hLi In hUl.Children
                        Debug.Print hLi.innerText
                    Next hLi
                End If
            End If
        End If
    Next hUl

End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM