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

如何用Selenium选中指定页面同class的div并点击提取数据?

完整实现:遍历咨询卡片并提取数据

嘿,我来帮你把这段Selenium代码补全,实现点击每个tile-consultation卡片、提取内部数据的需求。先给你梳理核心思路,再上完整代码,最后讲几个关键细节~

核心思路

  1. 先等待页面加载完成,一次性获取所有tile-consultation元素列表
  2. 逐个遍历列表中的卡片,点击进入详情页
  3. 在详情页中提取目标数据(比如教授姓名、咨询时间、地点等)
  4. 返回列表页面,继续处理下一个卡片
  5. 用显式等待替代生硬的Thread.sleep,让代码更稳定可靠

完整代码示例

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.List;

public class ConsultationDataScraper {
    public static void main(String[] args) {
        // 初始化你的WebDriver(比如ChromeDriver,这里替换成你实际的初始化代码)
        WebDriver driver = ...;
        driver.get("http://raspored.finki.ukim.mk/Home/Consultations");

        // 初始化显式等待,最长等待10秒
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        
        // 等待所有咨询卡片加载完成,获取元素列表
        List<WebElement> consultationTiles = wait.until(
            ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("tile-consultation"))
        );

        // 遍历每个咨询卡片
        for (int i = 0; i < consultationTiles.size(); i++) {
            // 每次循环重新获取元素列表(避免页面跳转后出现StaleElement异常)
            consultationTiles = wait.until(
                ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("tile-consultation"))
            );
            WebElement currentTile = consultationTiles.get(i);
            
            // 点击当前卡片进入详情页
            currentTile.click();

            // 等待详情页加载完成,开始提取数据(以下选择器为示例,需根据实际页面结构修改)
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".consultation-detail-container")));
            String professorName = driver.findElement(By.cssSelector(".professor-fullname")).getText();
            String consultationTime = driver.findElement(By.cssSelector(".consultation-time-slot")).getText();
            String consultationRoom = driver.findElement(By.cssSelector(".consultation-room")).getText();

            // 输出或保存提取到的数据
            System.out.println("第" + (i+1) + "条咨询信息:");
            System.out.println("教授姓名:" + professorName);
            System.out.println("咨询时间:" + consultationTime);
            System.out.println("咨询地点:" + consultationRoom);
            System.out.println("------------------------");

            // 返回列表页面,准备处理下一个卡片
            driver.navigate().back();
            // 等待列表页面重新加载完成
            wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("tile-consultation")));
        }

        // 关闭浏览器驱动
        driver.quit();
    }
}

关键细节说明

  • 解决StaleElement异常:因为点击卡片后页面会跳转,之前获取的元素列表会失效,所以每次循环都要重新获取元素列表,确保操作的是当前页面的有效元素。
  • 显式等待的优势:WebDriverWait会根据元素的实际加载状态等待,比固定时长的Thread.sleep更灵活,能适配不同的网络和页面加载速度。
  • 自定义数据提取选择器:代码中的.professor-fullname等选择器是示例,你需要打开浏览器开发者工具(F12),查看详情页的HTML结构,替换成对应元素的css选择器或XPath。
  • 遍历方式选择:这里用普通for循环加索引的方式,比ListIterator更直观,也更方便处理页面跳转后的元素重获取问题。

内容的提问来源于stack exchange,提问作者M.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:06:31