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

Python Selenium如何提取class为second span下无类名嵌套span的动态内容

问题原因

  • class_参数匹配多类名的方式错误
    你要匹配的span有两个独立类名second和span,直接传字符串'second span'无法被BeautifulSoup正确识别,匹配多个类名时需要传入列表格式。
  • 没有等待动态内容渲染完成
    Selenium执行driver.get()仅代表页面初始静态HTML加载完成,你要提取的是动态渲染内容,大概率是JS异步加载生成的,此时直接获取page_source可能目标元素还没渲染出来,导致找不到对应节点。
  • 元素定位精准度不足
    找到父span后直接获取文本,若后续页面结构变动容易提取到冗余内容,最好显式定位到内部无类名的子span。

修正后的实现代码

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

opts = Options()
opts.add_argument("--headless")
# 可选补充参数,防止无头模式被网站反爬拦截
opts.add_argument("--disable-blink-features=AutomationControlled")
opts.add_argument("--no-sandbox")

# 用os.path.join适配不同系统的路径分隔符,避免兼容问题
chrome_driver = os.path.join(os.getcwd(), "chromedriver.exe")
# 适配高版本Selenium的写法,若使用3.x旧版本可以保留原有webdriver.Chrome传参逻辑
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(chrome_driver), options=opts)
driver.get("替换为你的目标页面URL")

# 增加显式等待,最长等待10秒,直到目标元素渲染完成
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'span.second.span'))
    )
except Exception as e:
    print("等待元素加载超时:", e)
    driver.quit()
    exit()

soup_file = driver.page_source
# 指定lxml解析器,避免默认解析器的兼容问题
soup = BeautifulSoup(soup_file, 'lxml')

# 多类名匹配传入列表,之后再查找内部子span
my_span_parent = soup.find("span", class_ = ["second", "span"] )
my_target_span = my_span_parent.find("span")
# strip=True自动去掉首尾的空白换行符
print(my_target_span.get_text(strip=True))

driver.quit()

额外排查方向

如果修改后还是无法拿到目标内容,可以先打印driver.page_source确认目标内容是否已经渲染到页面源码中,排查是不是页面有反爬机制拦截了无头浏览器的访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:36:05