如何使用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
相关产品推荐
相关产品推荐

