Screenscraping - переход от нескольких имен тегов к имени класса - PullRequest
0 голосов
/ 26 сентября 2018

Трудно добраться до синей линии, чтобы присвоить ей значение (это текстовое поле):

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 голосов
/ 26 сентября 2018

Вы должны иметь возможность использовать:

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

Это предназначается для родительского идентификатора main и класса целевого элемента .textbox125 PatientID.Поскольку составные имена классов не допускаются, для удаления пробелов требуется дополнительная ..

Если вы не хотите использовать querySelector, используя только то, что видимо, предположение будет использовать имя тега и перейти к:

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

Помните:

Вы всегда можете щелкнуть правой кнопкой мыши, чтобы получить базовый селектор / путь к элементу

image

И,чем длиннее путь, который вы используете, тем более хрупким становится ваш метод.


Чем длиннее путь:

Из того, что я вижу, вам нужен тег 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
0 голосов
/ 26 сентября 2018

Запустите только это:

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.
  • С помощью мыши выберите слово myElement, чтобы оно стало синим.
  • Нажмите Shift + F9 и войдите в локальное окно.
  • В локальном окне посмотрите все дерево и скопируйте его в свой код.

enter image description here

...