Поиск ссылки на элемент кнопки HTML (класс, тег и т.д.) Для автоматического нажатия VBA?

#html #excel #vba #web-scraping #element

#HTML #excel #vba #очистка веб-страниц #элемент

Вопрос:

Я пытаюсь извлечь данные с одного из внутренних веб-сайтов нашей компании, который использует HTML. Кнопка, которую я пытаюсь нажать, — это кнопка CSV, но, несмотря на попытки использовать разные методы, я не могу заставить VBA найти этот элемент.

Я могу использовать VBA для открытия веб-страницы, но я ничего не понимаю в HTML, поскольку я всегда использовал другие методы сбора данных,

Я пробовал usig .getElementsByClassName, но я получаю объект, который не поддерживает этот метод.

Использование getElementsById позволяет мне пройти мимо этого, но objElement тогда не поддерживает .Click

 Sub OpenIE()

Dim IE As InternetExplorerMedium
Set IE = New InternetExplorerMedium

Dim HTMLDoc As HTMLDocument
Dim objElement As HTMLObjectElement

With IE
    .Visible = True
    .Navigate "internal website link"
    While .Busy Or .ReadyState <> READYSTATE_COMPLETE: Wend
    Set HTMLDoc = .document
    Set objElement = HTMLDoc.getElementById("btn btn-default buttons-csv buttons-html5")
    objElement.Click


    .Quit
End With

Set IE = Nothing
End Sub
  

Код кнопки HTML:

 <a class=" "btn btn-default buttons-csv buttons-html5"  tabindex="0" aria-controls="inboundTransfersTable" href="#"><span>CSV</span></a>
  

Конечным результатом является разрешение открытия CSV в виде новой книги / листа Excel, поскольку оттуда я очень хорошо знаком с сортировкой / фильтрацией данных.

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

Любая помощь была бы с благодарностью принята

Спасибо

Комментарии:

1. Вы используете .getElementById , но указанное вами значение не является идентификатором элемента (предполагается, что предоставленный вами HTML-код является полным и правильным, потому что в том виде, в каком он есть сейчас, кажется, что он должен выдавать ошибку?)

2. Я действительно получаю сообщение об ошибке при objElement.Click, которое является «Переменной объекта или с переменной блока block не установлено». Из моего тестирования до сих пор я не могу получить ничего для поддержки метода .Click. Я также пробовал getElementsByTag, который выдает ошибки в заданной строке

3. Это может быть потому, что Set objElement = HTMLDoc.getElementById("btn btn-default buttons-csv buttons-html5") не вернул объект, значение которого должно быть установлено objElement . Итак, когда вы просите нажать ( objElement.Click ), у него нет объекта для нажатия

4. Это, конечно, не спагетти-код и намного лучше, чем многие сообщения о создании веб-страниц, которые я вижу. 1

Ответ №1:

Попробуйте использовать один класс в селекторе css

 HTMLDoc.querySelector(".buttons-csv").click
  

Это

 btn btn-default buttons-csv buttons-html5
  

это составной класс, в котором каждый пробел представляет начало нового имени класса. Может быть возможно сопоставить только один класс (предпочтительно). Я выбрал вероятный вариант buttons-csv . Вы можете просто присоединять классы с помощью «.» внутри селектора, чтобы добавить больше классов к селектору, например

 .btn.btn-default
  

В селекторе есть два класса.


Цикл синхронизации для обеспечения присутствия элемента:

 Dim t As Date, ele As Object
Const MAX_WAIT_SEC As Long = 10

t = Timer
Do
    On Error Resume Next
    Set ele = HTMLDoc.querySelector(".buttons-csv")
    On Error GoTo 0
    If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While ele Is Nothing

If Not ele Is Nothing Then
    ele.Click
End If
  

Комментарии:

1. Спасибо, это полезно знать! Я добавил свой код с помощью Set objElement = HTMLDoc.querySelector("buttons-csv") With objElement .Click End With но, к сожалению, objElement по-прежнему ничего не показывает. я пробовал другие варианты, такие как .btn и .btn-по умолчанию он по-прежнему выдает ошибку в .Click из-за нулевого значения, я думаю

2. Перед кнопками должна быть точка

3. Если вы выполните HTMLDoc.querySelector(«.buttons-csv»).click, какое сообщение об ошибке вы получите?

4. в настоящее время я все еще получаю ошибку «Переменная объекта не установлена» после включения точки,

5. Ок .. итак, что произойдет, если вы поставите задержку перед этой строкой приложения. Подождите сейчас Timeserial (0,0,3)