讲师中心 微信公众号
AI工具推荐 视频效率加速

Selenium 自动化点击动态加载表格中可点击 td 元素的完整解决方案

夜强酱_1645

夜强酱_1645

发布时间:2026-02-07 09:58:04

|

946人浏览过

|

来源于php中文网

原创

Selenium 自动化点击动态加载表格中可点击 td 元素的完整解决方案

本文详解如何在 selenium 中可靠点击伦敦证券交易所动态渲染页面中带 `.clickable.td-with-link` 类的 `

` 元素,涵盖 cookie 弹窗处理、动态内容等待、元素可见性与可点击性校验及多级页面跳转实践。

在自动化抓取伦敦证券交易所(LSE)Price Explorer 页面(如 Bonds 分类页)时,直接调用 click() 失败是常见问题。根本原因并非代码逻辑错误,而是页面存在三层阻断机制:① 首次访问强制弹出 Cookie 同意横幅;② 表格数据通过 Angular 动态异步加载,<tbody> 初始为空或含 class="disabled" 占位符;③ 可点击 <td> 实际包裹在 <span class="ellipsed"> 内,直接对 <td> 调用 click() 常因事件委托失效或遮挡而失败。

以下为经过实测验证的稳健解决方案,采用显式等待 + 精准定位 + 安全交互策略:

✅ 步骤一:显式等待并接受 Cookie 弹窗

Cookie 横幅会阻塞后续所有元素交互。需先定位并点击「Accept All Cookies」按钮(XPath 稳定性较高,但建议配合 WebDriverWait 防止过早查找):

Html2md
Html2md

使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

下载
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 selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 15)  # 延长超时至15秒,适应慢速网络

url = "https://www.php.cn/link/12b71d68d0493e7ac7c5e0558c0a498e"
driver.get(url)

# 等待并点击 Cookie 接受按钮(关键前置步骤)
try:
    accept_btn = wait.until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept All Cookies')]"))
    )
    accept_btn.click()
    print("✅ Cookie banner accepted.")
except Exception as e:
    print("⚠️  Cookie banner not found or not clickable — proceeding anyway.")
注意:避免使用绝对 XPath(如 /html/body/div/div[2]/...),因其极易因页面结构微调而失效。优先选择含语义文本(如 "Accept All Cookies")的相对 XPath 或 CSS 选择器。

✅ 步骤二:等待动态表格真实数据加载完成

目标表格 #price-explorer-results-wrapper 加载后,其 <tbody> 内部仍可能处于 class="disabled" 状态(即占位符)。需等待首个可点击的公司名称 <span> 出现且可见:

# 等待表格主体(tbody)内出现至少一个有效的 instrument-name span
first_company_span = wait.until(
    EC.visibility_of_element_located((
        By.CSS_SELECTOR, 
        "table#price-explorer-results-wrapper tbody tr.slide-panel td.instrument-name.gtm-trackable.td-with-link span.ellipsed"
    ))
)
print(f"✅ Found first company: {first_company_span.text.strip()}")

✅ 步骤三:安全点击公司名称并跳转详情页

直接对 <td> 调用 click() 易失败,应定位内部 <span> 并确保其可点击、无遮挡。推荐使用 ActionChains 模拟真实用户操作(滚动+点击),并捕获新窗口句柄:

from selenium.webdriver.common.action_chains import ActionChains

# 获取所有公司名称 span 元素(非 td!)
company_spans = driver.find_elements(
    By.CSS_SELECTOR, 
    "table#price-explorer-results-wrapper tbody tr.slide-panel td.instrument-name.gtm-trackable.td-with-link span.ellipsed"
)

for i, span in enumerate(company_spans[:3]):  # 示例:仅处理前3家公司
    try:
        # 滚动到元素顶部,消除遮挡
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", span)
        wait.until(EC.element_to_be_clickable(span))

        # 使用 ActionChains 点击(比 span.click() 更鲁棒)
        ActionChains(driver).move_to_element(span).click().perform()

        # 等待新窗口打开并切换
        wait.until(lambda d: len(d.window_handles) > 1)
        driver.switch_to.window(driver.window_handles[-1])

        # 此处可开始解析公司详情页(如 https://www.londonstockexchange.com/stock/957X/3i-group-plc/company-page)
        print(f"✅ Navigated to detail page for: {span.text.strip()}")

        # 【示例】提取 Instrument ID(位于详情页右上角)
        try:
            instrument_id = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "div.instrument-id span"))
            ).text.strip()
            print(f"   Instrument ID: {instrument_id}")
        except:
            print("   ❌ Could not extract Instrument ID")

        # 关闭当前详情页,返回主窗口
        driver.close()
        driver.switch_to.window(driver.window_handles[0])

    except Exception as e:
        print(f"❌ Failed to click company #{i+1} ({span.text.strip()}): {str(e)}")
        continue

⚠️ 关键注意事项总结

  • 绝不依赖 time.sleep():它不可靠且拖慢执行。全程使用 WebDriverWait 配合 expected_conditions(如 element_to_be_clickable, visibility_of_element_located)。
  • 定位目标要精准:.clickable.instrument-name... 是 <td> 的 class,但实际可点击区域是其子 <span>。对 <td> 点击常因 Angular 事件绑定机制失败。
  • 处理动态禁用状态:若 <div class="disabled"> 存在,说明数据尚未就绪,需等待其消失或被真实内容替换(可通过 EC.invisibility_of_element_located 显式等待)。
  • 管理多窗口:每次点击链接都会打开新标签页,务必及时 switch_to.window() 并 close(),避免句柄泄漏。
  • 反爬友好提示:添加 --disable-blink-features=AutomationControlled 和 user-agent 模拟真实浏览器(生产环境建议)。

通过以上结构化流程,即可稳定实现从 LSE 动态表格中逐个点击公司名称、跳转详情页并提取结构化数据的全链路自动化。核心在于:尊重前端渲染生命周期,以用户视角设计交互,用显式等待替代猜测式延时。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

11959

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1146

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

824

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1906

2025.08.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3956

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

306

2025.12.06

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

486

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

325

2026.05.13

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

20

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6万人学习

CSS教程
CSS教程

共754课时 | 98.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn