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

Python使用Selenium定位存在的class元素时无法获取文本如何解决

问题根因

无法获取元素文本是四个核心问题导致的:

  • driver.get()执行后不会等待页面动态渲染的评论模块加载完成,直接执行元素查找时,class为WoYOw的评论节点还没插入DOM,find_elements会直接返回空列表
  • Naver店铺的访客评论模块默认嵌在独立iframe中,不切换到iframe的上下文,在主页面DOM里永远搜不到评论区的子元素
  • 代码里的default_comment没有在每个URL的循环开头重置,会把之前店铺的评论内容全部拼接到当前结果里,出现数据串扰
  • 评论区是滚动懒加载逻辑,不触发页面滚动的话,首屏之外的评论根本不会渲染,另外部分反爬场景下元素可见但直接读.text拿不到值,需要读元素的textContent属性兜底
修复方案
  1. 每次跳转页面后先等待评论iframe加载完成,切换到iframe上下文
  2. 加显式等待,等WoYOw类的评论元素加载可见后再执行查找
  3. 每个URL循环开头重置default_comment为空字符串,避免内容串扰
  4. 增加滚动加载逻辑,触发懒加载拿到全部评论,取文本优先读textContent属性兜底

修复后的可运行代码如下:

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

review_text_list = []
wait = WebDriverWait(driver, 10) # 最长等待10秒,可根据网络情况调整

for i, url in enumerate(df['naver_store_url']):
    # 每个店铺循环开头重置评论存储变量,避免串数据
    default_comment = ""
    driver.get(url+'/review/visitor')
    time.sleep(1) # 给基础页面加载留基础缓冲

    # 切换到评论所在的iframe,Naver评论iframe的title默认包含"리뷰"关键词
    try:
        review_iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[title*="리뷰"]')))
        driver.switch_to.frame(review_iframe)
    except:
        # 没找到iframe说明页面结构异常,存空值后跳过,避免中断整个循环
        review_text_list.append("")
        driver.switch_to.default_content()
        continue

    # 循环滚动触发懒加载,直到所有评论加载完成
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1.5) # 等待懒加载内容渲染,网络差可适当调大
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

    # 等评论元素加载完成后再提取内容
    try:
        all_elements = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "WoYOw")))
        for comment in all_elements:
            # 优先读.text,拿不到值就取textContent属性兜底
            comment_text = comment.text.strip() if comment.text.strip() else comment.get_attribute("textContent").strip()
            if comment_text:
                default_comment += comment_text +'/'
    except:
        default_comment = ""

    review_text_list.append(default_comment)
    # 切回主页面上下文,准备访问下一个链接
    driver.switch_to.default_content()
注意事项
  • 如果运行后还是找不到元素,打开浏览器开发者工具检查WoYOw是不是前端动态生成的临时类名,如果是就换用评论元素的固定属性(比如角色标记、固定父级结构)定位,不要用可变的动态类名
  • 如果遇到需要登录才能查看评论的店铺,要提前在代码里加登录逻辑,否则只能拿到空内容
  • 不要删除切回主页面的步骤,否则下一次循环访问新链接时会出现上下文错误

内容的提问来源于stack exchange,提问作者박진영

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:18:30