使用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()
关键修改点说明
- 多类名匹配:用
soup.select("article.dkt-product.js-product-slider-init.product-printed")替代原有的findAll,CSS选择器的点语法天然支持多类名匹配,更直观。 - 页面等待:添加
time.sleep(3)或显式等待,确保产品元素已经渲染到页面中。 - 内容提取:对每个
find返回的Tag对象,用.get_text(strip=True)提取纯文本,同时加了空值判断,避免出现AttributeError。 - 评分选择器修正:换成了实际的评分元素类名
dkt-product__rating__stars,能正确拿到星级评分文本。
内容的提问来源于stack exchange,提问作者sinage
相关产品推荐
相关产品推荐

