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

如何使用Python+Selenium爬取TripAdvisor酒店名称及data-location属性值

问题原因及解决方法

一、无法打印酒店名称的核心原因

  • Selenium版本语法不兼容:新版Selenium(v4.0+)已经完全弃用find_elements_by_css_selector、find_element_by_xpath这类旧写法,必须统一使用find_element(By.选择器类型, 选择器内容)的语法,你代码中用了旧写法又套了try except吞掉了报错,所以没有输出。
  • 元素定位规则失效:你写的绝对XPath、固定类名选择器非常不稳定,TripAdvisor页面结构、类名会频繁更新,而且节点顺序稍微调整,绝对路径就会找不到元素。
  • 没有等待动态内容加载完成:酒店列表是异步渲染的,你切换排序后没有等待列表渲染完成就直接获取元素,自然拿不到内容。

二、提取data-location属性的方法

直接调用WebElement对象的get_attribute()方法即可,写法为元素对象.get_attribute('data-location'),拿到的字符串可以按需转成数值格式。

三、修正后可运行的代码

!pip install selenium
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 初始化浏览器,Selenium v4.6+无需指定executable_path,会自动匹配chromedriver
browser = webdriver.Chrome(executable_path='C:\ProgramData\Anaconda3\Lib\site-packages\jupyterlab\chromedriver.exe')
browser.get('https://en.tripadvisor.com.hk/Hotels-g294217-Hong_Kong-Hotels.html')
browser.maximize_window()
time.sleep(3) # 等待页面初始加载

# 关闭日期选择弹窗(不需要指定日期的场景下,比手动选择日期更稳定)
try:
    close_btn = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[contains(@aria-label,"Close")]')))
    close_btn.click()
except:
    pass

# 选择旅行者排名排序
try:
    sort_dropdown = WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.XPATH, '//span[text()="Sort by"]/parent::div')))
    sort_dropdown.click()
    traveler_sort = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, '//div[text()="Traveler ranking"]')))
    traveler_sort.click()
except Exception as e:
    print("排序选择失败", e)

# 等待酒店列表加载完成
WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="property-card"]')))
# 获取所有酒店卡片
hotel_cards = browser.find_elements(By.CSS_SELECTOR, 'div[data-testid="property-card"]')

for card in hotel_cards:
    try:
        # 提取酒店名称
        hotel_name = card.find_element(By.XPATH, './/div[contains(@class,"listing_title")]/a').text
        # 提取data-location属性
        data_location = card.get_attribute('data-location')
        print(f"酒店名称:{hotel_name},data-location:{data_location}")
    except:
        continue

browser.quit()

注意事项

  • 如果需要保留原有的日期选择逻辑,建议把绝对XPath替换成包含文本、属性特征的相对XPath,避免页面结构调整后失效。
  • 如果爬取过程中出现反爬验证,可以适当增加等待时间,或者添加无头浏览器、UA伪装等配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:54:07