getelementsbyclassname Excel vba - ошибка при повторных вызовах

Утро,

У меня возникли проблемы с веб-скрейпом из Excel, из-за чего getelementsbyclassname не может воздействовать на некоторые объекты, вызывая ошибку «Объект не поддерживает это свойство или метод».

Проблема возникает, когда объект, который я передаю в getelementsbyclassname, сам является результатом метода getelementsbyclassname. Я не уверен, почему, особенно потому, что я могу получить имя класса при воздействии на более крупный объект...

Вот выдержка из кода

''''Boring Variables Declaration I've cut out''''

'Initialise IE
Dim IEApp As New InternetExplorer 
Set IEApp = New InternetExplorer 
IEApp.Visible = True 'JB

'Open page and wait for page to load
  IEApp.navigate ("http://www.anicewebsite.com")
  Do Until IEApp.readyState = READYSTATE_COMPLETE And IEApp.Busy = False
    DoEvents
  Loop

Set HTMLdoc = IEApp.document
Set RefLocation = Sheets("INFO_DUMP").Range("LocationRefCell")
Set trElements = HTMLdoc.getElementsByClassName("basic-details")
For Each trElement In trElements
        'Select the LHS box and extract info
        Set tdElement = trElement.getElementsByClassName("tieredToggle")
        'write start/end locations
        '''''THIS NEXT LINE THROWS AN ERROR'''''
         Data_str = tdElement.getElementsByClassName("title").innerText
        '''''AS DOES'''''
        MyObject=tdElement.getElementsByClassName("title")
         RefLocation.Offset(1, 2).Value = Data_str 
Next 'close tr Loop         

Однако я могу получить объект title через

For Each trElement In trElements
        Set MyObject=trElement.getElementsByClassName("title")
Next 'close tr Loop

так что ошибка, предположительно, связана с tdElement (коллекция DispHTMLElement), изображение которой я пытался прикрепить, но мне не хватает репутации (см. ссылку в конце поста)...

Большое спасибо за любую помощь.

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

http://i.stack.imgur.com/1tyb6.png


person Mark_Anderson    schedule 18.07.2015    source источник
comment
tdElement — это коллекция, вам придется перебирать ее так же, как вы делаете это для trElements   -  person Flakes    schedule 18.07.2015
comment
О, ты настоящая звезда. Совершенно правильно - мне нужно зациклиться, чтобы получить доступ к свойствам объектов. Спасибо. Кажется, это немного неэлегантно, есть ли способ выбрать элементы, а затем работать с ними напрямую без объектного цикла? Я даже должен сделать это, если getelementsbyclassname выбирает один объект...   -  person Mark_Anderson    schedule 18.07.2015
comment
Если вам всегда нужно обрабатывать первый элемент, вы можете использовать это обозначение: tdElement(0) (первый элемент в коллекции), или вы можете использовать getElementById() и указать идентификатор первого элемента. Дополнительная информация на этой странице Mozilla   -  person paul bica    schedule 18.07.2015


Ответы (1)


Вы можете использовать это, чтобы получить внутренний текст.

Data_str = tdElement.getElementsByClassName("title")(0).innerText

Вместо ("title")(0) вы можете ввести значение индекса, где присутствует элемент.

person Vignesh Shankar    schedule 18.07.2015