#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)