问题
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