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

使用Python WebDriver与BeautifulSoup 4爬取Decathlon.fr时article类元素获取失败问题

解决Decathlon.fr爬虫无法获取产品数据的问题

我帮你排查了下代码里的几个关键问题,调整后应该就能正常拿到数据了:

核心问题分析

  • 类名匹配错误:你写的'dkt-product.js-product-slider-init.product-printed'是把多个类名用点连在一起当成字符串,但BeautifulSoup的findAll对多类名的匹配需要用列表形式,或者用CSS选择器语法更靠谱。
  • 页面未完全加载:Decathlon的页面是动态渲染的,WebDriver刚打开页面就获取page_source,可能产品元素还没渲染出来,需要加等待。
  • 元素内容提取缺失:你直接把find返回的Tag对象存入列表,最后打印的是对象而非实际文本,需要用.get_text(strip=True)提取内容。
  • 评分选择器错误:原代码里找span[itemprop='name']根本不是评分元素,得换成实际的评分选择器。

修改后的完整代码

from bs4 import BeautifulSoup
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
import time

products = []  # 存储产品名称
prices = []    # 存储产品价格
ratings = []   # 存储产品评分

# 初始化Chrome驱动(注意:如果是新版本Chrome,无需指定chromedriver.exe路径,会自动匹配)
driver = webdriver.Chrome()
driver.get("https://www.decathlon.fr/search?Ntt=t+shirt+anti+uv+b%C3%A9b%C3%A9")

# 等待页面加载完成(两种方式选一种即可)
# 方式1:简单休眠3秒
time.sleep(3)
# 方式2:显式等待,直到产品元素出现(更可靠)
# WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "article.dkt-product")))

content = driver.page_source
soup = BeautifulSoup(content, "html.parser")

# 用CSS选择器匹配多类名的article元素,更简洁准确
for article in soup.select("article.dkt-product.js-product-slider-init.product-printed"):
    # 提取产品名称
    name_tag = article.find('a', class_='dkt-product__title__wrapper')
    product_name = name_tag.get_text(strip=True) if name_tag else "无名称"
    products.append(product_name)
    
    # 提取产品价格
    price_tag = article.find('div', class_='dkt-product__price')
    product_price = price_tag.get_text(strip=True) if price_tag else "无价格"
    prices.append(product_price)
    
    # 提取产品评分(实际是星级对应的文本,比如"4.8/5")
    rating_tag = article.find('div', class_='dkt-product__rating__stars')
    product_rating = rating_tag.get_text(strip=True) if rating_tag else "无评分"
    ratings.append(product_rating)

# 打印结果
print("产品名称列表:")
for name in products:
    print(name)
print("\n产品价格列表:")
for price in prices:
    print(price)
print("\n产品评分列表:")
for rating in ratings:
    print(rating)

driver.quit()

关键修改点说明

  1. 多类名匹配:用soup.select("article.dkt-product.js-product-slider-init.product-printed")替代原有的findAll,CSS选择器的点语法天然支持多类名匹配,更直观。
  2. 页面等待:添加time.sleep(3)或显式等待,确保产品元素已经渲染到页面中。
  3. 内容提取:对每个find返回的Tag对象,用.get_text(strip=True)提取纯文本,同时加了空值判断,避免出现AttributeError。
  4. 评分选择器修正:换成了实际的评分元素类名dkt-product__rating__stars,能正确拿到星级评分文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:07:38