MS Access VBA使用Selenium提取数据时报对象所需错误如何解决
VBA Selenium 爬取网页「对象所需」错误解决方案
错误触发原因
你遇到的报错核心由两个问题导致:
By.className仅支持传入单个CSS类名,你代码中传入的sc-pZopv gQWHwO是两个独立类名,带空格的参数无法被正确识别,导致找不到对应元素,调用空对象的.Text属性就会触发「对象所需」错误。- 页面渲染的
div.rt-tr-group行可能存在预留空行,内部不存在你要提取的目标元素,没有做存在性校验直接取值也会触发报错。
修正后代码
Const URL As String = "https://www.tmdn.org/tmview/#/tmview/results?page=1&pageSize=30&criteria=C&basicSearch=Bolígrafo" Dim d As ChromeDriver Dim elements As Selenium.WebElements Dim element As Selenium.WebElement Dim trade As String Dim targetEle As Selenium.WebElement Set d = New ChromeDriver With d .Start "Chrome" .Get URL ' 显式等待列表加载完成,比固定Sleep兼容性更强 .Wait 10000, Not .FindElementByCss("div.rt-tr-group", timeout:=10000) Is Nothing Set elements = .FindElementsByCss("div.rt-tr-group") For Each element In elements ' 捕获元素查找失败的异常 On Error Resume Next ' 用CSS选择器匹配多类名,替代className方法 Set targetEle = element.FindElementByCss(".sc-pZopv.gQWHwO", timeout:=500) On Error GoTo 0 ' 仅当元素存在时才取值 If Not targetEle Is Nothing Then trade = targetEle.Text ' 此处可自行添加将trade写入Access表的逻辑 Debug.Print trade ' 立即窗口输出验证提取结果 End If Set targetEle = Nothing Next element End With MsgBox "数据提取完成" d.Quit Set d = Nothing
补充说明
- 如果需要提取分层的子类数据,只需要在当前
element(主类行)的作用域下,用对应的CSS选择器匹配子类元素即可,逻辑和上述目标元素匹配一致。 - 该网站的类名是前端框架自动生成的随机类,若后续爬取失效,可重新检查元素的类名是否发生变更,同步更新选择器即可。
内容的提问来源于stack exchange,提问作者Satti22
相关产品推荐
相关产品推荐

