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
相关产品推荐
相关产品推荐

