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

Excel VBA爬取Booking.com酒店信息时getElementById返回空问题求助

修复方案

核心错误原因

  • 语法错误:getElementById 为单数方法,仅返回单个DOM元素,不可直接使用For Each遍历;获取类名对应元素的方法为复数getElementsByClassName,返回可遍历的元素集合
  • 页面加载逻辑缺陷:Booking搜索结果采用动态渲染机制,原生IE的readyState判断仅能确认基础页面加载完成,酒店列表的动态内容还未渲染就执行查找,自然返回空值
  • 类名匹配误差:代码中类名sr_property_block 末尾多了多余空格,无法匹配页面实际类名

修复后代码

Sub test()
    Dim ws As Worksheet: Set ws = Sheets("scrape")
    Dim objIE As Object
    Set objIE = CreateObject("InternetExplorer.Application")
    Dim url As String, ResRw As Long, ResCol As Long
    Dim hotelList As Object, hotelItem As Object
    Dim waitTime As Integer: waitTime = 0 ' 超时等待计数,最多等10秒
    
    url = ws.Range("A1")
    
    With objIE
        .navigate url
        .Visible = True
    End With
    
    ' 基础页面等待
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
    
    ' 新增:等待酒店列表元素渲染完成
    Do While objIE.Document.getElementById("hotellist_inner") Is Nothing
        Application.Wait Now + TimeValue("00:00:01")
        waitTime = waitTime + 1
        If waitTime > 10 Then MsgBox "页面加载超时": GoTo quitIE ' 超时退出
    Loop
    
    ResRw = 2
    ' 直接获取列表容器,不需要遍历
    Set hotelList = objIE.Document.getElementById("hotellist_inner")
    ' 获取容器下所有酒店元素
    For Each hotelItem In hotelList.getElementsByClassName("sr_property_block")
        ResCol = 1
        ' 这里添加你需要的字段提取逻辑,比如酒店名称、评分等
        ' 示例:提取酒店名称 ws.Cells(ResRw, ResCol) = hotelItem.querySelector(".sr-hotel__name").innerText: ResCol = ResCol +1
        
        ResRw = ResRw + 1
    Next
    
quitIE:
    objIE.Quit
    Set objIE = Nothing
End Sub

补充说明

如果需要提取具体字段,可以通过querySelector方法匹配对应类名的元素获取内容,比如酒店名称对应类名sr-hotel__name,评分对应bui-review-score__badge,距离对应sr_card_address_line__distance。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:30:01