Извлечь список всех полей ввода на веб-странице VBA - PullRequest
0 голосов
/ 06 мая 2018

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

Sub IEInteract()

Dim i As Long
Dim URL As String
Dim IE As Object
Dim objCollection As Object

Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = True

URL = "mywebsite.com"

IE.Navigate URL

Do While IE.ReadyState = 4: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop

objCollection = IE.Document.getElementsByTagName("input")

For Each el In objCollection
label = el.label 'or something like that????'
Debug.Print label

Next el

End Sub

Куда я иду не так? Спасибо

Кстати, мой VBA в порядке, но мой HTML не существует.

1 Ответ

0 голосов
/ 07 мая 2018
  1. В учебных целях может быть выбран веб-сайт с более очевидными полями ввода, а не с раскрывающимися списками.
  2. Многие поля ввода не будут предварительно заполнены, поэтому, возможно, стоит рассмотреть чтение других свойств найденных элементов. Или даже написать им, а затем получить эти значения.
  3. Выбор по имени тега может вернуть множество элементов, которые вы, возможно, не ожидали.

Учитывая все вышесказанное. Попробуйте выполнить следующее, чтобы сгенерировать коллекцию элементов тега <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

Пример вывода:

Sample results

Из вышесказанного выглядит, что имя класса может быть в некоторых отношениях более информативным, если вы ищете целевые поля для ввода информации.

Первоначальный осмотр источника страницы, выбор поля ввода и щелчок правой кнопкой мыши> осмотреть ... помогут вам уточнить ваш выбор.

Я заметил, что у многих интересующих коробок был тег Input, а затем type = "text"

Username box

Это означает, что вы можете нацеливать элементы, соответствующие этому шаблону, используя 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

Пример результатов:

Примечание. Я отредактировал интервал для большего соответствия изображению.

Refined results

Ссылки добавлены через VBE> Инструменты> Ссылки

References

Последние два представляют интерес. Нижний будет зависеть от версии, и вам нужно будет переписать XMLHTTP60, чтобы XML 6.0 указывал на вашу версию Excel, если не используете Excel 2016.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...