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

Selenium Python定位Booking.com酒店名称元素失败问题求助

问题分析与修复方案

你的代码核心问题出在多类名的元素定位方式错误,以及存在冗余逻辑,具体问题和修复如下:

核心错误点

  • By.CLASS_NAME和find_elements_by_class_name不支持空格分隔的多类名:这两个方法只能识别单个类名,你传入的"fcab3ed991 a23c043802"会被当成一个包含空格的完整类名,而页面中不存在这样的元素,因此定位失败。
  • 冗余的等待与定位逻辑:两次单独等待元素无必要,且从单个元素查找子元素的逻辑不符合页面结构(酒店名称是同级元素,并非某个父元素的子元素)。

修复后的代码

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

PATH = "C:\\Program Files (x86)\\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.booking.com/searchresults.html?label=gen173nr-1FCAEoggI46AdIM1gEaAKIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4AvqR75YGwAIB0gIkZDQ4MTdjZDctYzIyNC00N2RlLWJhYjItZDU1YTAwMGU2M2Q12AIF4AIB&sid=8005d0cc6b75af8d0d2e74451b73cb8b&aid=304142&sb=1&sb_lp=1&src_elem=sb&error_url=https%3A%2F%2Fwww.booking.com%2Findex.html%3Flabel%3Dgen173nr-1FCAEoggI46AdIM1gEaAKIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4AvqR75YGwAIB0gIkZDQ4MTdjZDctYzIyNC00N2RlLWJhYjItZDU1YTAwMGU2M2Q12AIF4AIB%26sid%3D8005d0cc6b75af8d0d2e74451b73cb8b%26sb_price_type%3Dtotal%26%26&ss=Jumeirah%2C+Dubai%2C+Dubai+Emirate%2C+United+Arab+Emirates&is_ski_area=&checkin_year=2022&checkin_month=8&checkin_monthday=1&checkout_year=2022&checkout_month=8&checkout_monthday=3&group_adults=2&group_children=0&no_rooms=1&map=1&b_h4u_keep_filters=&from_sf=1&ss_raw=jum&ac_position=1&ac_langcode=en&ac_click_type=b&dest_id=941&dest_type=district&place_id_lat=25.205553&place_id_lon=55.239216&search_pageview_id=c0ac477da63f02c2&search_pageview_id=c0ac477da63f02c2&search_selected=true&ac_suggestion_list_length=5&ac_suggestion_theme_list_length=0&order=price#map_closed")

try:
    # 等待所有酒店名称元素可见,确保页面加载完成
    WebDriverWait(driver, 15).until(
        EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".fcab3ed991.a23c043802"))
    )
    
    # 获取前50条酒店名称
    name_elements = driver.find_elements(By.CSS_SELECTOR, ".fcab3ed991.a23c043802")[:50]
    names = [elem.text for elem in name_elements]
    
    # 提取价格(类名需根据实际页面确认,此处为示例)
    price_elements = driver.find_elements(By.CSS_SELECTOR, ".d052722b20")[:50]
    prices = [elem.text for elem in price_elements]
    
    # 提取位置(类名需根据实际页面确认,此处为示例)
    location_elements = driver.find_elements(By.CSS_SELECTOR, ".f4bd0794db")[:50]
    locations = [elem.text for elem in location_elements]
    
    # 提取酒店链接(从名称元素的父级a标签获取)
    links = [elem.find_element(By.XPATH, "./ancestor::a").get_attribute("href") for elem in name_elements]
    
    # 输出结果示例
    for idx in range(len(names)):
        print(f"酒店{idx+1}:")
        print(f"名称: {names[idx]}")
        print(f"价格: {prices[idx]}")
        print(f"位置: {locations[idx]}")
        print(f"链接: {links[idx]}")
        print("-"*50)
        
except Exception as e:
    print(f"出错信息: {str(e)}")
finally:
    driver.quit()

关键说明

  1. CSS_SELECTOR处理多类名:使用.类名1.类名2的格式,表示同时拥有这两个类的元素,这是处理多类名元素的标准方式。
  2. 优化等待逻辑:用visibility_of_all_elements_located等待所有目标元素可见,避免因页面未完全加载导致的提取失败。
  3. 补充多字段提取:示例中补充了价格、位置、链接的提取逻辑,注意网站类名可能动态更新,需根据实际页面重新确认。
  4. 限制结果数量:通过切片[:50]直接获取前50条搜索结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:36:18