使用Selenium获取施华洛世奇胸针信息时遇AttributeError问题求助
解决Selenium获取施华洛世奇胸针名称的AttributeError问题
你遇到的AttributeError核心原因是循环里误用了find_elements()方法——这个方法返回的是元素列表,而列表没有text或get_attribute()属性,自然会触发报错。
修正后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get("https://www.swarovski.com/en-RO/c-0107/Categories/Jewelry/Brooches/") # 显式等待产品列表加载完成,用相对XPath提升稳定性 wait = WebDriverWait(driver, 15) all_products = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//div[contains(@class, 'product-tile')]//span[@class='product-name']") )) print(f"Number of products: {len(all_products)}") # 直接遍历已定位的名称元素,获取文本即可 for product in all_products: print(product.text) driver.quit()
关键修改说明
- 替换绝对XPath为相对路径:原代码的绝对XPath极度依赖页面结构,稍有变动就会失效,改用相对路径定位产品名称元素,适配性更强。
- 移除循环内重复定位:
all_products已经直接定位到所有产品名称元素,循环时直接调用product.text就能获取名称,无需再用find_elements()。 - 强化显式等待:用
presence_of_all_elements_located确保所有产品元素加载完成后再获取,避免因页面未加载完全导致的元素缺失。
如果需要基于父元素嵌套定位,也可以这么写(注意XPath开头的.表示相对当前元素):
# 先定位所有产品卡片父元素 all_product_cards = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//div[contains(@class, 'product-tile')]") )) for card in all_product_cards: # 基于当前卡片定位名称元素,用find_element()(单数)返回单个元素 product_name = card.find_element(By.XPATH, ".//span[@class='product-name']") print(product_name.text)
内容的提问来源于stack exchange,提问作者user20468552
相关产品推荐
相关产品推荐

