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()
关键说明
- CSS_SELECTOR处理多类名:使用
.类名1.类名2的格式,表示同时拥有这两个类的元素,这是处理多类名元素的标准方式。 - 优化等待逻辑:用
visibility_of_all_elements_located等待所有目标元素可见,避免因页面未完全加载导致的提取失败。 - 补充多字段提取:示例中补充了价格、位置、链接的提取逻辑,注意网站类名可能动态更新,需根据实际页面重新确认。
- 限制结果数量:通过切片
[:50]直接获取前50条搜索结果。
内容的提问来源于stack exchange,提问作者Mohammad Sakaamini
相关产品推荐
相关产品推荐

