VBA Selenium抓取Scopus表格遇NoSuchElementError问题求助
解决VBA Selenium抓取Scopus表格时的NoSuchElementError问题
问题根源分析
- 固定等待不可靠:
bot.Wait 5000是固定时长等待,无法保证页面元素完全加载完成,可能元素还没渲染就执行查找操作。 - 元素定位方法错误:
FindElementByClass("table")会匹配页面中所有class包含table的元素,定位不精确,应该用表格的唯一IDsourceResults来定位。FindElementByClass只能返回匹配到的第一个元素,要获取所有行需要用复数形式FindElementsByClass。
- 索引逻辑问题:直接通过索引访问元素集合,若集合为空会直接报错,需先确认元素存在。
修正后的代码
Sub ScrapeScopusTable() Dim URLtexto As String URLtexto = "https://www.scopus.com/sources.uri" Dim bot As New WebDriver Dim table As WebElement Dim rows As WebElements Dim row As WebElement Dim cells As WebElements Dim i As Integer, j As Integer '启动Edge浏览器并访问目标页面 bot.Start "edge" bot.Get URLtexto '显式等待表格加载完成(最长等待10秒) bot.Wait Until (bot.IsElementPresent(By.Id, "sourceResults")) Timeout:=10000 '定位目标表格 Set table = bot.FindElementById("sourceResults") '获取表格所有行 Set rows = table.FindElementsByClass("lightGreyBorderBottom") '遍历每一行并获取单元格数据 For i = 1 To rows.Count Set cells = rows(i).FindElementsByTag("td") Debug.Print "第" & i & "行数据:" For j = 1 To cells.Count Debug.Print " 第" & j & "列:" & cells(j).Text Next j Next i '关闭浏览器 bot.Quit End Sub
关键优化说明
- 显式等待:用
bot.Wait Until替代固定等待,确保元素加载完成后再执行操作,避免因加载延迟导致的找不到元素错误。 - 精确元素定位:通过表格ID
sourceResults定位目标表格,避免匹配到页面中其他无关的table元素。 - 复数元素查找:用
FindElementsByClass和FindElementsByTag获取多个元素集合,实现遍历所有行和单元格。 - 遍历数据:通过循环遍历行和单元格,完整提取表格中的所有数据。
额外注意事项
- Scopus网站可能需要登录才能访问完整数据,若运行代码后仍无法获取元素,需先实现登录逻辑(模拟输入账号密码并提交登录表单)。
- 若页面存在动态加载(如滚动加载更多行),还需要添加滚动页面的逻辑,确保所有行都被加载后再进行抓取。
内容的提问来源于stack exchange,提问作者Julio Joshué Puertas Valdez
相关产品推荐
相关产品推荐

