How to fetch the alt value from an img using vba

时光毁灭记忆、已成空白 提交于 2020-01-04 06:38:10

问题


Am trying to fetch the price table from this page

For this I have the following code:

Everything is working fine only the img alt tag of the last column is not displaying in the. This code is perfectly fine only the last column's class is not fetched.

Sub TableExample()

Dim IE As Object
Dim doc As Object
Dim strURL As String

    If Range("B2").Value <> "NA" Then
        strURL = "http://www.idealo.co.uk/compare/351072/canon-500d-77mm-close-up-lens.html"
        Set IE = CreateObject("InternetExplorer.Application")
        With IE
            '.Visible = True
            .navigate strURL
            Do Until .readyState = 4: DoEvents: Loop
            Do While .Busy: DoEvents: Loop
            Set doc = IE.document
            GetAllTables doc
            .Quit
        End With
    End If

End Sub

Sub GetAllTables(doc As Object)

    Dim ws As Worksheet
    Dim rng As Range
    Dim tbl As Object
    Dim rw As Object
    Dim cl As Object
    Dim tabno As Long
    Dim nextrow As Long
    Dim i As Long

    Set ws = Sheets("Sheet1")

    For Each tbl In doc.getElementsByTagName("TABLE")
        tabno = tabno + 1
        nextrow = nextrow + 1
        Set rng = ws.Range("B" & nextrow)
        rng.Offset(, -1) = "Table " & tabno
        On Error GoTo Err1:
        If tabno = 10 Then
            For Each rw In tbl.Rows
                colno = 6
                For Each cl In rw.Cells
                    If colno = 6 And nextrow > 10 Then
                        Set classColl = doc.getElementsByClassName("cellborder")
                        Set imgTgt = classColl(nextrow - 11).getElementsByTagName("img")
                        rng.Value = imgTgt(0).getAttribute("alt")
                    Else
                        rng.Value = cl.innerText
                    End If
                    Set rng = rng.Offset(, 1)
                    i = i + 1
                    colno = colno + 1
                Next cl
                nextrow = nextrow + 1
                Set rng = rng.Offset(1, -i)
                '     Call trim1
                i = 0
            Next rw
            Exit Sub
        End If
    Next tbl

Err1:
'Call comp
'    ws.Cells.ClearFormats
End Sub

回答1:


Try this (very dirty) variation for your GetAllTables subroutine:

Sub GetAllTables(doc As Object)

    Dim ws As Worksheet
    Dim rng As Range
    Dim tbl As Object
    Dim rw As Object
    Dim cl As Object
    Dim tabno As Long
    Dim nextrow As Long
    Dim i As Long

    Set ws = Sheets("Sheet1")

    'Improvised way of getting images.
    Dim imagesColl As New Collection
    Set imgColl = doc.getElementsByClassName("noborder")
    For Each imgElem In imgColl
        If imgElem.getAttribute("height") = 30 And imgElem.getAttribute("width") = 80 Then
            imagesColl.Add imgElem.getAttribute("alt")
        End If
    Next imgElem

    For Each tbl In doc.getElementsByTagName("table")
        tabno = tabno + 1
        If tabno = 10 Then
            nextrow = 1
            imgIter = 1
            For Each rw In tbl.Rows
                colno = 1
                For Each cl In rw.Cells
                    Set rng = ws.Cells(nextrow, colno)
                    If colno = 5 Then
                        rng.Value = imagesColl.Item(imgIter)
                        imgIter = imgIter + 1
                    Else
                        rng.Value = cl.innerText
                    End If
                    colno = colno + 1
                Next cl
                nextrow = nextrow + 1
            Next rw
            Exit Sub
        End If
    Next tbl

End Sub

Thing is, you don't really have to do it table style. If you know which elements to target, creating a collection for the data outside of the DOM (that is, using normal VBA collections) is much better IMHO.

Anyway, above is tried and tested. Let us know if this helps.




回答2:


All you need to do is specify which ClassColl's image to lookup.

Try this:

Set classColl = doc.getElementsByClassName("cellborder")
Set imgTgt = classColl(0).getElementsByTagName("img")
Rng.Value = imgTgt(0).getAttribute("alt")


来源:https://stackoverflow.com/questions/22008004/how-to-fetch-the-alt-value-from-an-img-using-vba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!