如何用Selenium选中指定页面同class的div并点击提取数据?
完整实现:遍历咨询卡片并提取数据
嘿,我来帮你把这段Selenium代码补全,实现点击每个tile-consultation卡片、提取内部数据的需求。先给你梳理核心思路,再上完整代码,最后讲几个关键细节~
核心思路
- 先等待页面加载完成,一次性获取所有
tile-consultation元素列表 - 逐个遍历列表中的卡片,点击进入详情页
- 在详情页中提取目标数据(比如教授姓名、咨询时间、地点等)
- 返回列表页面,继续处理下一个卡片
- 用显式等待替代生硬的
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
相关产品推荐
相关产品推荐

