使用Python+Selenium爬取bol.com评论时点击按钮定位失败的解决
解决Selenium无法定位"Toon meer"加载更多按钮的问题
我来帮你排查下问题,你遇到的No such element错误主要有几个原因,咱们一步步解决:
1. 错误的CSS选择器
你看原HTML里的按钮是<a>标签,不是<div>,而且两个类名review-load-more__button和js-review-load-more-button之间需要用.连接(表示同时拥有这两个类的元素),你之前的写法会被解析成"找div标签下的review-load-more__button类元素,再找它下面的js-review-load-more-button类元素",这明显和页面结构不符。
更靠谱的选择器可以直接用按钮的data-test属性,因为这个属性一般是专门给测试用的,不会轻易变动:
[data-test="review-load-more"]
2. 页面加载延迟导致元素未渲染
直接调用driver.find_element_by_css_selector()的时候,页面可能还没完全加载出这个按钮,所以需要加显式等待,等元素可点击后再操作,避免因为渲染延迟找不到元素。
3. 需要循环点击直到所有评论加载完成
这个按钮不是点一次就加载全部评论的,每次点击只会加载10条左右,所以要循环点击,直到按钮消失(没有更多评论可加载)。
修改后的完整代码
import requests import pandas as pd 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 from bs4 import BeautifulSoup from datetime import datetime import time start_time = datetime.now() data = [] link = "https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425897/" op = webdriver.ChromeOptions() op.add_argument('--ignore-certificate-errors') op.add_argument('--incognito') op.add_argument('--headless') driver = webdriver.Chrome(executable_path='D:/Desktop/work/real/chromedriver.exe', options=op) driver.get(link) wait = WebDriverWait(driver, 10) # 最多等待10秒 try: while True: # 等待加载更多按钮可点击 load_more_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-test="review-load-more"]'))) load_more_btn.click() time.sleep(1) # 给页面一点加载时间,也可以用显式等待等待评论加载完成 except Exception as e: # 当按钮消失(没有更多评论)时,会抛出异常,此时退出循环 print("所有评论已加载完成,或找不到加载按钮:", e) # 这里可以继续解析页面上的所有评论 soup = BeautifulSoup(driver.page_source, 'html.parser') # 后续的评论解析逻辑... driver.quit() print(f"总耗时: {datetime.now() - start_time}")
关键说明
- 用
WebDriverWait替代直接查找元素,保证元素已加载完成 - 循环点击按钮直到抛出异常(按钮消失),确保加载全部评论
- 选择器用
[data-test="review-load-more"]比类名更稳定,避免网站更新类名导致代码失效
内容的提问来源于stack exchange,提问作者mht




