You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA Selenium抓取Scopus表格遇NoSuchElementError问题求助

解决VBA Selenium抓取Scopus表格时的NoSuchElementError问题

问题根源分析

  1. 固定等待不可靠:bot.Wait 5000是固定时长等待,无法保证页面元素完全加载完成,可能元素还没渲染就执行查找操作。
  2. 元素定位方法错误:
    • FindElementByClass("table")会匹配页面中所有class包含table的元素,定位不精确,应该用表格的唯一IDsourceResults来定位。
    • FindElementByClass只能返回匹配到的第一个元素,要获取所有行需要用复数形式FindElementsByClass。
  3. 索引逻辑问题:直接通过索引访问元素集合,若集合为空会直接报错,需先确认元素存在。

修正后的代码

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替代固定等待,确保元素加载完成后再执行操作,避免因加载延迟导致的找不到元素错误。
  • 精确元素定位:通过表格IDsourceResults定位目标表格,避免匹配到页面中其他无关的table元素。
  • 复数元素查找:用FindElementsByClass和FindElementsByTag获取多个元素集合,实现遍历所有行和单元格。
  • 遍历数据:通过循环遍历行和单元格,完整提取表格中的所有数据。

额外注意事项

  • Scopus网站可能需要登录才能访问完整数据,若运行代码后仍无法获取元素,需先实现登录逻辑(模拟输入账号密码并提交登录表单)。
  • 若页面存在动态加载(如滚动加载更多行),还需要添加滚动页面的逻辑,确保所有行都被加载后再进行抓取。

内容的提问来源于stack exchange,提问作者Julio Joshué Puertas Valdez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:35