Объект Excel VBA IE и использование раскрывающегося списка

Я экспериментирую с веб-автоматизацией и немного пытаюсь использовать раскрывающийся список.

Мой код работает до момента поиска названия компании и нажатия «перейти». На новой странице я не могу найти правильный код, который выбирает группу элементов, представляющих раскрывающийся список. Затем я хочу выбрать «100» записей, но я даже не могу захватить узлы, представляющие этот список.

Я просматривал несколько разных страниц в stackoverflow, на которых рассказывается о селекторах CSS, и просматривал учебные пособия, но, похоже, это тоже не помогает. Либо я ничего не получаю, либо то, что я захватываю, не может использовать метод getElementsByTagName, который в конечном итоге я пытаюсь развернуть в узлах td и select. Пока не знаю, что с ними делать, но я даже не могу их взять. Мысли?

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

Вспомогательный сайт CSS: https://www.w3schools.com/cssref/trysel.asp

Код:

Option Explicit

Sub test()
    On Error GoTo ErrHandle
    
    Dim ie As New InternetExplorer
    Dim doc As New HTMLDocument
    Dim ws As Worksheet
    Dim stopLine As Integer
    
    Dim oSearch As Object, oSearchButton As Object
    
    Dim oForm As Object
    Dim oSelect As Object
    Dim list As Object
    
    
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ie.Visible = True
    ie.navigate "https://www.sec.gov/edgar/searchedgar/companysearch.html"
    
    Do
    DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE
    
    Set doc = ie.Document
    
    Set oSearch = doc.getElementById("companysearchform")
    Set oSearchButton = oSearch.getElementsByTagName("input")(1)
    Set oSearch = oSearch.getElementsByTagName("input")(0)
    oSearch.Value = "Summit Midstream Partners, LP"
    
    oSearchButton.Click
    
    Do
    DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE
    
    Set doc = ie.Document
    
    Set list = doc.querySelectorAll("td select")
    
    
    stopLine = 1
    
    Exit Sub
    
ErrHandle:
        MsgBox Err.Number & " - " & Err.Description, vbCritical
        Exit Sub
        
    
End Sub

Set list = doc.querySelector("#count"), похоже, ничего не возвращает, когда я смотрю на окно местных жителей в Excel.

necroncryptek 18.12.2020 09:17

Вы оставили достаточно долго ждать? Выполнить построчно с F8

QHarr 18.12.2020 09:18

разве это не то, для чего предназначен второй набор цикла «выполнить события»? После того, как я нажимаю «Поиск», он ждет, пока следующая веб-страница будет готова, правильно?

necroncryptek 18.12.2020 09:20
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
3
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

td select вернет один узел, поэтому вам нужен только querySelector. У узла есть идентификатор, поэтому вы можете использовать более быстрый querySelector("#count") для нацеливания на родителя select. Чтобы изменить параметр, вы можете использовать SelectedIndex для родительского выбора или выбрать дочерний параметр по его атрибуту valuequerySelector("[value='100']").Selected = True. Затем вам может потребоваться прикрепить и вызвать change/onchange htmlevent к родителю select, чтобы зарегистрировать изменение.

Однако я бы просто извлек CIK компании из текущей страницы, а затем объединил параметр count=100 с URL-адресом и .Navigate2, используя следующий формат:

https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0001549922&type=&dateb=&owner=include&count=100&search_text=

Вы можете извлечь CIK после того, как первоначальная поисковая компания нажмет и дождется загрузки страницы, с помощью:

Dim cik As String

cik = ie.document.querySelector("[name=CIK]").value

ie.Navigate2 "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK = " & cik & "&type=&dateb=&owner=include&count=100&search_text = "

Учитывая, что несколько параметров оставлены пустыми, вы, вероятно, можете сократить до:

"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK = " & cik & "&owner=include&count=100"

Если вы не можете получить первоначальный выбор родителя, вам, вероятно, понадобится цикл по времени, ожидающий появления этого элемента после нажатия кнопки поиска. Пример показан здесь в ответе StackOverflow.

таймер, казалось, исправил это - спасибо!. просто из любопытства, в чем разница между событиями и таймером? Теоретически я бы предположил, что они являются почти избыточными функциями, при этом doevents более надежны, потому что они фактически ожидают состояния от объекта ie, а не просто ждут произвольное количество времени, пока объект не будет равен ничему.

necroncryptek 18.12.2020 09:56

Таймер связан с циклом до тех пор, пока не будут выполнены указанные вами условия выхода. DoEvents- Обеспечивает выполнение, чтобы операционная система могла обрабатывать другие события. У вас должны быть условия ожидания загрузки страницы Whilst ie.Busy или Ie.ReadyState <> 4. Для динамических страниц это не гарантирует загрузку всего содержимого.

QHarr 18.12.2020 10:02

Другие вопросы по теме