You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Selenium获取TripAdvisor酒店页最后页码 香港页面出现元素查找异常求助

解决TripAdvisor香港酒店页面无法获取最后页码的问题

嘿,作为网页抓取新手遇到这种元素定位问题太正常啦,我来帮你拆解下问题并给出解决方案~

问题根源分析

马来西亚和瑞士的酒店页面能正常运行,但香港页面报错「无法找到元素」,大概率是这几个原因:

  • 香港页面的分页元素加载逻辑不同:日期选择后页面动态渲染的内容结构和其他地区有差异,导致你用的CSS选择器span.pageNum.last匹配不到目标元素
  • 隐式等待不够可靠:driver.implicitly_wait(5)是全局等待,但有时候元素需要更长时间加载,或者需要等待特定状态(比如元素可点击、可见)
  • 人工干预的不确定性:手动点击日期和Update的时机不稳定,可能导致页面还没完全渲染就去查找元素

解决方案步骤

1. 把人工干预的日期选择自动化(关键!)

手动操作太容易出错,我们用Selenium自动完成日期选择和更新:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

# 初始化浏览器
driver = webdriver.Chrome(executable_path=r'C:\Users\user\Downloads\chromedriver.exe')
url = "https://www.tripadvisor.com.sg/Hotels-g294217-Hong_Kong-Hotels.html"
driver.get(url)

# 显式等待日期选择框加载完成
wait = WebDriverWait(driver, 10)

# 点击Check in日期框
check_in = wait.until(EC.element_to_be_clickable((By.ID, "CHECKIN_DATE")))
ActionChains(driver).move_to_element(check_in).click().perform()

# 选择明天作为入住日期(可根据需求调整,d1代表明天)
check_in_date = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.calendar-day[data-day='d1']")))
check_in_date.click()

# 点击Check out日期框,选择后天作为退房日期
check_out = wait.until(EC.element_to_be_clickable((By.ID, "CHECKOUT_DATE")))
ActionChains(driver).move_to_element(check_out).click().perform()
check_out_date = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.calendar-day[data-day='d2']")))
check_out_date.click()

# 点击Update按钮
update_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.ta-button.primary")))
update_btn.click()

# 等待分页区域加载完成(显式等待更稳妥,这里先用sleep演示)
time.sleep(2)

2. 修正分页元素的定位器

先打开香港酒店页面,按F12打开开发者工具,手动完成日期选择后,在分页区域右键点击最后页码选择「检查」,确认元素的CSS选择器是否为span.pageNum.last。如果结构不同,就修改代码中的选择器:

# 用显式等待查找最后页码元素
last_page_elem = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.pageNum.last")))
last_page_s = last_page_elem.get_attribute('data-page-number')
last_page = int(last_page_s)
print(f"香港酒店页面最后页码:{last_page}")

3. 额外优化:滚动到分页区域

如果分页元素在页面底部,可能需要先滚动到该区域才能让元素被识别:

# 滚动到分页区域
pagination = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.pageNumbers")))
driver.execute_script("arguments[0].scrollIntoView();", pagination)

注意事项

  • 确保ChromeDriver版本和Chrome浏览器版本匹配,否则会出现兼容性问题
  • 频繁抓取TripAdvisor可能触发反爬,建议加上适当等待时间,不要过快请求
  • 如果还是找不到元素,可以尝试更换定位方式,比如用XPath代替CSS选择器

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

火山引擎 最新活动