屏幕抓取-向下浏览几个标签名到一个类名

时间:2018-09-25 21:35:44

标签: excel vba excel-vba web-scraping screen-scraping

很难到达蓝线以赋予它一个值(这是一个文本框):

img1

这是我当前尝试达到的目标-代码返回了典型的Run-time error '91': Object variable or With block variable not set

IE.Document.GetElementById("main"). _
GetElementsByTagName("div")(0). _
GetElementsByTagName("div")(0). _
GetElementsByTagName("div")(0). _
GetElementsByTagName("table")(0). _
GetElementsByTagName("tbody")(0). _
GetElementsByTagName("tr")(0). _
GetElementsByTagName("td")(0). _
GetElementsByClassName("textbox125 PatientID")(0).Value = patientid

自从我完成屏幕抓取以来已经有一段时间了,我猜我那里有一个额外的标签名称,或者我在其中一个标签的商品编号上有误...而且在有人问之前,我不太喜欢查询选择器,我更喜欢这样写:)。

2 个答案:

答案 0 :(得分:3)

您应该可以使用:

ie.document.querySelector("#main .textbox125.PatientID")

这将定位main的父ID和目标元素类.textbox125 PatientID。由于不允许使用复合类名,因此需要额外的.来删除空格。

如果您不想使用querySelector,仅使用可见的内容,则猜测将使用标签名称并进行以下操作:

ie.document.getElementsByTagName("input")(1)

记住:

您始终可以右键单击以获取元素上的基本选择器/ xpath

而且,使用的路径越长,方法就越脆弱。


更长的路径:

据我所见,您需要 second td标签,即索引1,然后使用子input标签重复该操作。这是基于可见的!确实需要实际的HTML进行测试,因为我对这样做的可行性不确定。

IE.Document.GetElementById("main"). _
GetElementsByTagName("div")(0). _
GetElementsByTagName("div")(0). _
GetElementsByTagName("div")(0). _
GetElementsByTagName("table")(0). _
GetElementsByTagName("tbody")(0). _
GetElementsByTagName("tr")(0). _
GetElementsByTagName("td")(1). _
GetElementsByTagName("input")(1).Value = patientid

答案 1 :(得分:1)

仅运行此:

session.generateLogout()
  • 它在Sub TestMe() Dim objApp As Object Set objApp = CreateObject("InternetExplorer.Application") objApp.Navigate "www.stackoverflow.com" Do While objApp.readyState <> 4 DoEvents Loop Dim myDocument As Object: Set myDocument = objApp.Document Dim myElement As Object: Set myElement = myDocument.getElementById("footer") Stop End Sub 行上停止。
  • 使用鼠标选择单词Stop,使其变为蓝色。
  • Shift + F9 并进入本地窗口。
  • 在本地窗口中,查看整棵树并将其复制到您的代码中。

enter image description here