如何使用vba从img获取alt值

我正试图从这个页面获取价格表

为此,我有以下代码:

一切正常,只有最后一列的img alt标签没有显示在。 这段代码完全没问题,只有最后一列的类没有被提取。

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 

为你的GetAllTables子程序尝试这个(非常脏的)变体:

 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 

事情是,你真的不需要做表格式。 如果你知道哪些元素的目标,为DOM外的数据创build一个集合(也就是使用正常的 VBA集合)是更好的恕我直言。

无论如何,以上是经过考验和testing 。 让我们知道这是否有帮助。

所有你需要做的是指定要查找哪个ClassColl的图像。

尝试这个:

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