получить ЭЛЕМЕНТ byProperty против получить ЭЛЕМЕНТОВ byProperty
Есть в основном два различных типа команд для извлечения одного или нескольких элементов из веб-страницы .Document
; те, которые возвращают один объект, и те, которые возвращают коллекцию объектов.
Получение ЭЛЕМЕНТ
Когда getElementById
используется, вы просите для одного объекта (например, MSHTML.IHTMLElement
). В этом случае свойства (например, .Value
, .innerText
, .outerHtml
и т. Д.) Могут быть получены непосредственно. Внутри тела HTML не должно быть больше одного уникального свойства id, поэтому эта функция должна безопасно возвращать единственный элемент в пределах i.e.document
, который соответствует.
'typical VBA use of getElementById
Dim CompanyName As String
CompanyName = ie.document.getElementById("CompanyID").innerText
Оговорка: Я заметил, что все большее число веб-дизайнеров, которые, кажется, думают, что, используя тот же id
для нескольких элементов ой ключ-DOH-ключ до тех пор, как идентификаторы находятся в различных родительских элементов, таких как различные <div>
элементов. AFAIK, это явно неправильно, но, похоже, это растущая практика. Будьте осторожны с тем, что возвращается при использовании .getElementById
.
Получение ЭЛЕМЕНТОВ
При использовании getElementsByTagName
, getElementsByClassName
и т.д., где слово элементы множественное число, вы возвращаете коллекцию (например MSHTML.IHTMLElementCollection
) объектов, даже если эта коллекция содержит только один или даже нет. Если вы хотите использовать их для прямого доступа к свойству одного из элементов в коллекции, необходимо указать порядковый номер , чтобы ссылаться на один элемент в коллекции. Номер индекса в этих коллекциях основан на нулевом значении (т.е. первый начинается с (0)).
'retrieve the text from the third <span> element on a webpage
Dim CompanyName As String
CompanyName = ie.document.getElementsByTagName("span")(2).innerText
'output all <span> classnames to the Immediate window until the right one comes along
'retrieve the text from the first <span> element with a classname of 'account-website-name'
Dim e as long, es as long
es = ie.document.getElementsByTagName("span").Length - 1
For e = 0 To es
Debug.Print ie.document.getElementsByTagName("span")(e).className
If ie.document.getElementsByTagName("span")(e).className = "account-website-name" Then
CompanyName = ie.document.getElementsByTagName("span")(e).innerText
Exit For
End If
Next e
'same thing, different method
Dim eSPN as MSHTML.IHTMLElement, ecSPNs as MSHTML.IHTMLElementCollection
ecSPNs = ie.document.getElementsByTagName("span")
For Each eSPN in ecSPNs
Debug.Print eSPN.className
If eSPN.className = "account-website-name" Then
CompanyName = eSPN.innerText
Exit For
End If
Next eSPN
Set eSPN = Nothing: Set ecSPNs = Nothing
Итак, если ваш метод Internet.Explorer
использует элементы (множественное число), а не Element (в единственном числе), вы возвращаете коллекцию, которая должна иметь индекс добавляется, если вы хотите, чтобы лечить один из элементы в коллекции как один элемент.
Всякий раз, когда вы используете что-то, что потенциально может получить больше, чем один элемент, вам необходимо предоставить порядковый индекс. Вы делаете это в первом примере с ** (1) **, который ссылается на второй элемент '' (ординалы основаны на нуле). Во втором примере вы опускаете порядковый номер, поэтому '.getElementsByClassName' не знает, что вернуть, даже если есть только одно, которое соответствует. – Jeeped
Ты босс! Благодаря! –
@Jeeped Это звучит скорее как ответ, чем комментарий, как насчет его выделения, публикация его как одного и получение репутации, которую вы, кажется, заслуживаете? – Aiken