- В учебных целях может быть выбран веб-сайт с более очевидными полями ввода, а не с раскрывающимися списками.
- Многие поля ввода не будут предварительно заполнены, поэтому, возможно, стоит рассмотреть чтение других свойств найденных элементов. Или даже написать им, а затем получить эти значения.
- Выбор по имени тега может вернуть множество элементов, которые вы, возможно, не ожидали.
Учитывая все вышесказанное. Попробуйте выполнить следующее, чтобы сгенерировать коллекцию элементов тега <input>
.
Код:
Option Explicit
Public Sub PrintTagInfo()
'Tools > references > Microsoft XML and HTML Object library
Dim http As New XMLHTTP60 '<== this will be specific to your excel version
Dim html As New HTMLDocument
With http
.Open "GET", "https://www.mrexcel.com/forum/register.php", False
.send
html.body.innerHTML = .responseText
End With
Dim inputBoxes As MSHTML.IHTMLElementCollection, iBox As MSHTML.IHTMLElement, i As Long
Set inputBoxes = html.getElementsByTagName("input") '<== the collection of input tags on the page
'<== These are input boxes i.e. you are putting info into them so perhaps populate and then try to read what is in the entry box?
For Each iBox In inputBoxes
Debug.Print "Result #" & i + 1
Debug.Print vbNewLine
Debug.Print "ID: " & iBox.ID '<== select a sample of properties to print out as some maybe empty
Debug.Print "ClassName: " & iBox.className,
Debug.Print "Title: " & iBox.Title
Debug.Print String$(20, Chr$(61))
Debug.Print vbNewLine
i = i + 1
Next iBox
End Sub
Пример вывода:
Из вышесказанного выглядит, что имя класса может быть в некоторых отношениях более информативным, если вы ищете целевые поля для ввода информации.
Первоначальный осмотр источника страницы, выбор поля ввода и щелчок правой кнопкой мыши> осмотреть ... помогут вам уточнить ваш выбор.
Я заметил, что у многих интересующих коробок был тег Input
, а затем type = "text"
Это означает, что вы можете нацеливать элементы, соответствующие этому шаблону, используя CSS селекторы . В этом случае используется селектор input[type=""text""]
.
Настройка прежнего кода с учетом этого дает меньший набор более целенаправленных результатов. Обратите внимание, что при использовании .querySelectorAll
для применения селектора CSS возвращается объект NodeList
, который требует другого метода итерации. Цикл For Each
приведет к аварийному завершению работы Excel, как описано здесь .
Код:
Option Explicit
Public Sub PrintTagInfo()
'Tools > references > Microsoft XML and HTML Object library
Dim http As New XMLHTTP60 '<== this will be specific to your excel version
Dim html As New HTMLDocument
With http
.Open "GET", "https://www.mrexcel.com/forum/register.php", False
.send
html.body.innerHTML = .responseText
End With
Dim inputBoxes As Object, i As Long
Set inputBoxes = html.querySelectorAll("input[type=""text""]") '<== the collection of text input boxes on page. Returned as a NodeList
'<== These are input boxes i.e. you are putting info into them so perhaps populate and then try to read what is in the entry box?
For i = 0 To inputBoxes.Length - 1
Debug.Print "Result #" & i + 1
Debug.Print vbNewLine
Debug.Print "ID: " & inputBoxes.Item(i).ID '<== select a sample of properties to print out as some maybe empty
Debug.Print "ClassName: " & inputBoxes.Item(i).className,
Debug.Print "Title: " & inputBoxes.Item(i).Title
Debug.Print String$(20, Chr$(61))
Debug.Print vbNewLine
Next i
End Sub
Пример результатов:
Примечание. Я отредактировал интервал для большего соответствия изображению.
Ссылки добавлены через VBE> Инструменты> Ссылки
Последние два представляют интерес. Нижний будет зависеть от версии, и вам нужно будет переписать XMLHTTP60
, чтобы XML 6.0
указывал на вашу версию Excel, если не используете Excel 2016.