我目前正在使用selenium和chromedriver在vba上进行网页抓取。
我登录一个网站(该网站是,不幸的是,无法到达由于登录的必要性,但它是https://monitoring.csisolar.com/login),并在主页,有一个通用表与一堆信息。
我使用"inspect element"并将表对象识别为图像:
打印找到的元素,表被高亮显示
当我选择"copy xpath",我得到这个:"//*[@id="mCSB_67_container"]/table">
当然,我是这样设置命令的:Set tabela = driver.FindElementByXPath("//*[@id="mCSB_67_container"]/table") 'Seleciona a tabela pelo java
If tabela Is Nothing Then
MsgBox "Não encontrado"
Else
tabela.AsTable().ToExcel (ActiveSheet.Cells(1, 1)) 'Cola a tabela na planilha (aba) onde está o botão
End If
但是excel上什么都不打印
我在其他类似的网站(solarweb.com)做了同样的事情,它运行得很好,但是表对象定义了id和类,而上面的表对象没有命名属性(如打印中所示)
我知道这个问题不是很清楚,但如果有什么可以帮助你理解,请在下面评论,我很乐意编辑我的问题
下面的东西正在创建动态id。你的目标是找到不会改变的选择器。然后使用它们在DOM中导航,直到找到您的表。在你的小摘录中,我没有看到任何永远不会改变的独特id。如果你只有一个表可见,你可以像这样找到它:
driver.findElement(By.cssSelector("table"));
mCSB_67_container
似乎是动态创建的id
值,即这不是固定的id
值。
我不确定(需要使用开发工具查看实际页面),但是您可以尝试使用这个XPath:
Set tabela = driver.FindElementByXPath("//div[contains(@class,'mCustomScrollBox']//table")
有时候,元素很难定位,如果是静态表和动态更新值页。更好的右键点击和复制xpath给chrome。这很有效。而不是写循环逻辑。
输入图片描述
正在尝试的问题不工作,因为该表元素是一个动态对象,所以它是"one_answers";class"属性不是常量,不能被引用。因此,感谢@Prophet和@David M,我发现我应该寻找一个静态引用,而不是网站界面的一部分,不是动态的,然后使用它来引用所述表。
我使用的元素是包含该元素的划分,该元素的ID为"plantlist"。下面是我找到这个元素的截图:
红色箭头指向table元素,绿色箭头指向用于引用
的静态元素从这一点开始,我只是通过每一个其他元素,直到我到达表。最后一行是这样的:
Set canadian = driver.FindElementByXPath("//*[@id=""plantList""]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table") 'Seleciona a tabela pelo java
If canadian Is Nothing Then
MsgBox "Não Encontrado"
Else
canadian.AsTable().ToExcel (ActiveSheet.Cells(1, 1)) 'Cola a tabela na planilha (aba) onde está o botão
End If