c# - C#+Selenium 网页抓取
问题描述
我想从https://zakup.sk.kz抓取一些数据。
首先,我初始化我的浏览器:
IWebDriver browser = new ChromeDriver();
browser.Navigate().GoToUrl("https://zakup.sk.kz/#/ext?tabs=lot&adst=PUBLISHED&lst=PUBLISHED&page=1");
之后,我点击框架:
IWebElement click = browser.FindElement(By.ClassName("m-found-item__num"));
click.Click();
在这个框架中存在我想要抓取的数据(我找到了 abs 路径):
IWebElement tru = browser.FindElement(By.XPath("/html[1]/body[1]/ngb-modal-window[1]/div[1]/div[1]/sk-main-dialog[1]/div[2]/div[6]/div[1]/div[1]/div[7]"));
Console.WriteLine(tru.Text);
在此之后,我需要切换到具有相同结构的下一帧,并抓取数据:
IWebElement next = browser.FindElement(By.XPath("//div[contains(@class, 'm-modal__arrow')]"));
next.Click();
IWebElement tru2 = browser.FindElement(By.XPath("/html[1]/body[1]/ngb-modal-window[1]/div[1]/div[1]/sk-main-dialog[1]/div[2]/div[6]/div[1]/div[1]/div[7]"));
Console.WriteLine(tru2.Text);
但是Selenium没有找到tru2,不知道为什么,因为每一帧的结构都一样?请告诉我,我该怎么办?
解决方案
当您单击next
箭头时,当前元素将在 Ajax 请求完成后被删除并添加,这里您需要WebDriverWait
IWebElement next = browser.FindElement(By.XPath("//div[contains(@class, 'm-modal__arrow')]"));
next.Click();
// wait max 15 seconds
IWait wait = new WebDriverWait(browser, TimeSpan.FromSeconds(15))
IWebElement tru2 = wait.Until(browser => browser.FindElement(By.XPath("(//div[@class="m-infoblock__layout"])[7]")));
Console.WriteLine(tru2.Text);
请注意,我使用 Xpath
(//div[@class="m-infoblock__layout"])[7]
推荐阅读
- json - 使用条件语句的 json 模式定义
- r - kable/kableExtra 为 group_rows 中的组标签添加上标
- java - 设计如何在列表中存储大对象
- elasticsearch - Hibernate Search 查询中 fullTextQuery.getResultList() 上的 com.google.gson.JsonArray.getAsString 错误
- android - 找不到任何带有 altbeacon android 的信标
- java - 使用从枚举初始化的字符串常量的 Switch Case 问题
- java - 在不同的监听器之间切换
- xamarin - 如何在 Xamarin Forms 中更改 SearchBar 键盘中的“搜索”按钮文本?
- javascript - PDF.js 获取一页的图像并将它们显示为 HTML
- sapui5 - 如何防止 SmartFilterBar 上的多选?