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

VBA爬取cartasocial.pt数据至Excel遇querySelector错误求助

问题解决思路

错误原因分析

你遇到的method "queryselector" of object "jscripttypeinfo" failed错误,主要来自这几个问题:

  1. 动态元素ID失效:页面中类似#_SocialLetterHomePortlet_WAR_cartasocialportlet_:form:entType_input的ID是Portlet框架动态生成的,每次页面加载可能变化,导致querySelector找不到目标元素。
  2. 变量声明不规范:VBA里Dim tipoEntidade, tipoEntidadeAtual, areaGeo, areaGeoAtual, pesquisa As Object这种写法,只有最后一个pesquisa是Object类型,其余变量默认是Variant类型,后续操作对象时容易出问题。
  3. DOM引用失效:点击搜索后页面跳转,你又重新导航回首页,此时之前获取的tipoEntidade、areaGeo等元素对象已经失效(原页面DOM已销毁),循环中再访问这些对象就会报错。
  4. 逻辑与需求不符:你明确要求“无需筛选或遍历所有筛选条件”,但代码却在遍历所有实体类型和地理区域,完全没必要做多余操作。

修正后的VBA代码(无需筛选,直接抓取所有数据)

先确保你在Excel的工具→引用中勾选了Microsoft Internet Controls和Microsoft HTML Object Library。

Sub CartaSocial_AllData()
    Dim ie As InternetExplorer
    Dim doc As HTMLDocument
    Dim btnPesquisa As Object
    Dim tblResultados As HTMLTable
    Dim row As HTMLTableRow
    Dim cell As HTMLTableCell
    Dim ws As Worksheet
    Dim rowNum As Integer
    
    ' 初始化IE和工作表
    Set ie = New InternetExplorer
    ie.Visible = True
    Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    ws.Name = "CartaSocial_Dados"
    rowNum = 1
    
    ' 导航到目标页面
    ie.Navigate "https://www.cartasocial.pt/"
    
    ' 等待页面加载完成
    Do While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
        Application.Wait DateAdd("s", 1, Now)
    Loop
    Set doc = ie.Document
    
    ' 直接点击搜索(不选任何筛选条件)
    ' 用name属性定位按钮,避开动态ID问题
    Set btnPesquisa = doc.querySelector("button[name='_SocialLetterHomePortlet_WAR_cartasocialportlet_:form:searchEntity_button']")
    If Not btnPesquisa Is Nothing Then
        btnPesquisa.Click
        
        ' 等待结果页加载
        Do While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
            Application.Wait DateAdd("s", 1, Now)
        Loop
        Set doc = ie.Document
        
        ' 定位结果表格(可根据页面实际结构调整选择器)
        Set tblResultados = doc.querySelector("table")
        If Not tblResultados Is Nothing Then
            ' 遍历表格行和单元格,写入Excel
            For Each row In tblResultados.Rows
                For Each cell In row.Cells
                    ws.Cells(rowNum, cell.Index + 1).Value = cell.innerText
                Next cell
                rowNum = rowNum + 1
            Next row
        Else
            MsgBox "未找到结果表格"
        End If
    Else
        MsgBox "未找到搜索按钮"
    End If
    
    ' 清理资源
    ie.Quit
    Set ie = Nothing
    Set doc = Nothing
    Set btnPesquisa = Nothing
    Set tblResultados = Nothing
End Sub

是否需要安装Selenium?

不是必须,但非常推荐:

  • Office2013搭配的IE版本较老,现代网站对IE兼容性差,很多JS特性不支持,容易出现元素定位失败、页面加载异常等问题。
  • Selenium配合Chrome或Firefox驱动,能更好处理动态渲染页面,元素定位更灵活,稳定性远高于IE自动化。
  • 如果VBA+IE的方案始终无法正常工作,直接切换到Selenium是更高效的选择。

内容的提问来源于stack exchange,提问作者PedroPinto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:47:38