使用Selenium爬取酒店房型与价格时选择器/XPath错误导致无输出的咨询
代码无输出的核心原因排查
- 定位类名完全错误:目标页面不存在
room-type-block类名,find_elements返回空列表,循环逻辑根本不会执行,自然没有任何打印结果 - 元素取值逻辑错误:Selenium的
find_elements_*方法返回WebElement对象列表,不存在.string属性,获取元素文本必须调用元素对象的.text方法 - 硬等待可靠性不足:房型数据为异步加载,固定
time.sleep(5)无法保证元素完全加载,网络波动时会直接定位失败 - Xpath规则过于脆弱:原XPath全靠多层DOM层级推导,只要页面任意父节点结构微调,规则就会完全失效
正确定位选择器的操作方法
- 打开目标页面按F12调出开发者工具,用左上角元素选择器点选要爬取的房型名称、价格元素
- 不要直接复制控制台生成的全路径XPath,优先提取元素自身的稳定特征:比如固定语义类名、
data-*自定义属性、唯一文本内容 - 验证规则有效性:在Elements面板按
Ctrl+F输入编写好的CSS选择器/XPath,能精准高亮匹配目标元素、无多余冗余匹配的规则,才可以放到代码中使用 - 替换硬等待为显式等待,避免等待时间不足或过长的问题
修正后的可运行代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By seleniumurl = 'https://www.bestwestern.co.uk/hotels/best-western-mornington-hotel-london-hyde-park-83187/in-2021-06-03/out-2021-06-05/adults-1/children-0/rooms-1' # 替换为本地chromedriver实际路径 driver = webdriver.Chrome(executable_path='C:\\Users\\Conor\\Desktop\\diss\\chromedriver.exe') driver.get(seleniumurl) # 显式等待最多15秒,直到所有房型容器加载完成 wait = WebDriverWait(driver, 15) # 用稳定的data-testid属性定位所有房型块,替代错误的类名 room_blocks = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '[data-testid="room-rate-card"]')) ) for block in room_blocks: # 定位单个房型名称,用text属性取实际文本 room_name = block.find_element(By.CSS_SELECTOR, '.room-name').text # 定位房型对应的价格 room_price = block.find_element(By.CSS_SELECTOR, '[data-testid="price-value"]').text print(f"房型:{room_name},价格:{room_price}") driver.quit()
注意:旧版Selenium的
find_elements_by_*语法已在4.x版本废弃,统一使用find_element(By.定位方式, "规则内容")的语法兼容性更好。
内容的提问来源于stack exchange,提问作者user12505655
相关产品推荐
相关产品推荐

