Selenium脚本无法通过类名定位元素获取图片URL问题排查
问题:无法获取HM商品页全屏图片URL
我想获取页面https://www2.hm.com/en_us/productpage.1109917007.html上的全屏图片URL。点击商品页的缩略图(类名为product-detail-thumbnail-image)会打开全屏图,我需要提取这个全屏图的URL。
我写了Selenium代码,逻辑是打开商品页、定位缩略图并点击、获取全屏图URL,但代码没有任何输出,也没打印“Found image!”,请问问题出在哪?
我尝试的操作
- 打开目标商品页
- 通过类名获取缩略图元素,点击缩略图
- 尝试获取打开的全屏图URL
预期结果
代码能成功获取全屏图URL,并打印“Found image!”
我的代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def web_driver(): options = webdriver.ChromeOptions() options.add_argument("--verbose") options.add_argument('--no-sandbox') options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument("--window-size=1920, 1200") options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(options=options) return driver driver = web_driver() driver.get('https://www2.hm.com/en_us/productpage.1109917007.html') delay = 5 image_urls = set() thumbnails = driver.find_elements(By.CLASS_NAME, "product-detail-thumbnail-image") print(thumbnails) for img in thumbnails: try: img.click() time.sleep(delay) except: continue images = driver.find_elements(By.CLASS_NAME, "current fullscreen-image-modal-image") for image in images: if image.get_attribute('src') and 'http' in image.get_attribute('src'): image_urls.add(image.get_attribute('src')) print('Found image!') continue
问题分析与解决
1. 全屏图定位方式错误
By.CLASS_NAME仅支持单个类名,你写的"current fullscreen-image-modal-image"是两个类,无法通过By.CLASS_NAME定位。需要改用By.CSS_SELECTOR,写法为.current.fullscreen-image-modal-image(多个类名用点连接,无空格)。
2. 元素等待逻辑不可靠
time.sleep是固定等待,无法适配页面加载速度波动。改用WebDriverWait等待元素出现/可点击,能大幅提升代码稳定性。
3. 未处理页面弹窗
HM页面通常会有Cookie授权弹窗,不处理会遮挡元素,导致点击缩略图操作失效。
修正后的代码
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 import time def web_driver(): options = webdriver.ChromeOptions() options.add_argument("--verbose") options.add_argument('--no-sandbox') options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument("--window-size=1920, 1200") options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(options=options) return driver driver = web_driver() driver.get('https://www2.hm.com/en_us/productpage.1109917007.html') wait = WebDriverWait(driver, 10) image_urls = set() # 处理Cookie授权弹窗(如果存在) try: accept_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='accept-all-button']"))) accept_btn.click() except: pass # 等待缩略图加载完成 thumbnails = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "product-detail-thumbnail-image"))) print(f"找到{len(thumbnails)}个缩略图") for img in thumbnails: try: # 确保缩略图可点击后再点击 wait.until(EC.element_to_be_clickable(img)).click() # 等待全屏图加载完成并定位 fullscreen_img = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".current.fullscreen-image-modal-image"))) img_src = fullscreen_img.get_attribute('src') if img_src and 'http' in img_src: image_urls.add(img_src) print('Found image!') print(f"图片URL: {img_src}") except Exception as e: print(f"处理缩略图时出错: {e}") continue print(f"最终获取的图片URL集合: {image_urls}") driver.quit()
内容的提问来源于stack exchange,提问作者Danny_webb
相关产品推荐
相关产品推荐

