我试图读取动态表格,每秒更新1-3次。我在Python 3.x中使用Selenium,但是如果你有其他语言的解决方案,我也可以解决它。
我的问题是:阅读经常更新的表格的最佳做法是什么?
我尝试了什么:
driver.wait.until
以及expected_conditions
find_elements
重新读取该表由于高刷新率,它们都没有工作。我可以暂时成功检索表,但是当我尝试访问它的行时,我得到一个陈旧的异常。值得一提的是,当我在同一个表中尝试相同的代码时,更新频率较低,一切正常。
我暂时没有发布任何代码,因为我有兴趣知道在这种情况下更有经验的人做了什么。
我天真的想法:在网络抓取或任何网络相关语言中都不是专家(但很想学习),我说如果这是动态数据的问题,我将指针或对实际表的引用(然后在行上动态循环)。这可能在这个框架中吗?
答案 0 :(得分:2)
与Webelement创建时的属性相比,当Webelement目前已更改时,我们通常会遇到过时的元素异常。
假设我的意图是每秒在表格中打印第二个数据元素,我们的代码看起来像这样,(很抱歉用Java提供代码)
//This will work if the page is static
WebElement element = driver.findElement(By.xpath("//td[2]"));
for(int i = 0; i< 10;i++)
{
System.out.println(element.getText());
Thread.sleep(1000);
}
为了使这个工作用于动态加载表/刷新表,我们需要在每次迭代之前启动webelement,
//This will work for dynamic content
WebElement element = null;
for(int i = 0; i< 10;i++)
{
element = driver.findElement(By.xpath("//td[2]"));
System.out.println(element.getText());
Thread.sleep(1000);
}
在这种情况下,如果需要在表中获取第i个单元格值,我们可以参数xpath中的值,例如,
//In this case we need the fifth cell value
int j = 5;
WebElement element = null;
for(int i = 0; i< 10;i++)
{
element = driver.findElement(By.xpath("//td["+j+"]"));
System.out.println(element.getText());
Thread.sleep(1000);
}
In the case if you need to have all five cell values,
WebElement element = null;
for(int i = 1; i<=5;i++)
{
element = driver.findElement(By.xpath("//td["+i+]"));
System.out.println(element.getText());
Thread.sleep(1000);
}
相应地构建一个循环。
希望这会对你有所帮助。感谢。