【发布时间】:2018-09-22 01:46:22
【问题描述】:
我正在关注 WiseOwlTutorials 频道制作的此视频 https://www.youtube.com/watch?v=sGw6r5GVA5g&t=2803s 的教程,但卡在了他在视频 36:00 位置解释的列表过程中。
此时,他开始解释如何通过称为 Sub ListVideosOnPage(VidCatName As String, VidCatURL As String) 的迭代方法从特定类别返回视频 url 和视频列表的名称,该方法在另一个模块中使用,该模块循环遍历其网站主视频的所有视频类别页面https://www.wiseowl.co.uk/videos(左角菜单列表)。
当此过程开始时,它会进入每个视频类别并从该类别中获取每个视频的名称和 url,以便将其列在一个页面上,在上面引用的 Youtube 视频的那部分中,该页面是一个调试页面.但是,实际的 WiseOwl 视频页面与制作教程视频时的页面不同。
所以,我稍微改变了他的方法,以便在 debbugin 页面上放置正确的元素,如下所示:
Sub ListVideosOnPage(VidCatName As String, VidCatURL As String)
Dim XMLReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim VidTables As MSHTML.IHTMLElementCollection
Dim VidTable As MSHTML.IHTMLElement
Dim VidRows As MSHTML.IHTMLElementCollection
Dim VidRow As MSHTML.IHTMLElement
Dim VidLink As MSHTML.IHTMLElement
XMLReq.Open "GET", VidCatURL, False
XMLReq.send
If XMLReq.Status <> 200 Then
MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText
Exit Sub
End If
HTMLDoc.body.innerHTML = XMLReq.responseText
'get the table element in each video category found by other module
'VidTables tag added by me to get the new element on the WiseOwl website
Set VidTables = HTMLDoc.getElementsByTagName("table")
'loop starts to search for row and link tags on the current table
For Each VidTable In VidTables
Set VidRows = VidTable.getElementsByTagName("tr")
For Each VidRow In VidRows
Set VidLink = VidRow.getElementsByTagName("a")(0) 'just pick the first link
Debug.Print VidRow.innerText, VidRow.getattribute("href") 'objetc variable not set error happpens here
Next VidRow
Next VidTable
End Sub
我找到了一种绕过Object Variable or With Variable not set 错误的方法,方法是更改 vidrow 循环内的代码,在代码中添加手动索引以仅获取每行中的第一个链接:
For Each VidTable In VidTables
Set VidRows = VidTable.getElementsByTagName("tr")
For Each VidRow In VidRows
Index = 0
For Each VidLink In VidLinks
If Index = 0 Then
Debug.Print VidLink.innerText, VidLink.getAttribute("href")
Index = Index + 1
End If
Next VidLink
Next VidRow
Next VidTable
但是,在上面引用的教程视频中,当讲师以如下所示的方式编码索引时,并没有出现此错误:
VidLink = VidRow.getElementsByTagName("a")(0)
Debug.Print VidRow.innerText, VidRow.getattribute("href")
所以我的问题是如何让这些对象变量未设置错误,而在教程视频中教师没有?对我来说看起来像相同的代码,每个元素都以正确的方式定义,并且比使用 if 更有效地编写代码。有没有人更习惯 VBA 请帮忙回答这个问题?也许我错过了什么。
【问题讨论】:
标签: vba debugging indexing web-scraping