GetElementsByClassName не может получить класс InnerText

Я не могу понять, как получить элементы по имени класса. У меня есть следующий тег. Я могу сделать getelementsbytagname, выполнив ("div") и перечислив его номер элемента, но в этом случае я хотел перейти к элементу имени класса 2. На веб-странице есть тег.

<div class="column">

Projected Delivery Date:

</div>


<div class="column">

11/28/2017                                                                                                           
</div>

Я пытаюсь получить дату там. Это код, который я использовал для этого. Он не работает ни с группой «partner_info», ни с «колонкой». Я перебираю все теги, и он, кажется, не поднимает их.

Private Function TrackNEW(trackingNumber As String) As String
Dim xml As Object
Dim tempString As String
Dim htmlDoc As Object  ' MSHTML.HTMLDocument
Dim htmlBody As Object  ' MSHTML.htmlBody
Dim anchors As Object  ' MSHTML.IHTMLElementCollection
Dim anchor As Object  ' MSHTML.IHTMLElement
Dim dda As Object  ' MSHTML.IHTMLElementCollection
Dim ddb As Object
Dim ddc As Object
Dim ddd As Object
Dim span As Object
Dim div As Object  ' MSHTML.IHTMLElement

Set xml = GetMSXML
If xml Is Nothing Then  ' cannot start MSXML 6.0
TrackNEW = MSXML_ERROR
Exit Function
End If

tempString = GetResponse(xml, HTTP_GET, NEWUrl & trackingNumber, False)

If Len(tempString) = 0 Then

TrackNEW = ERROR_MSG
Exit Function
End If

Set htmlDoc = CreateHTMLDoc
If htmlDoc Is Nothing Then  ' cannot reference MSHTML object library
TrackNEW = MSHTML_ERROR
Exit Function
End If

Set htmlBody = htmlDoc.body
htmlBody.innerHtml = tempString
On Error Resume Next

Set dda = htmlDoc.getElementsByTagName("span")
Set ddb = htmlDoc.getElementsByTagName("span")
Set ddc = htmlDoc.getElementsByTagName("span")
Set ddd = htmlDoc.getElementsByClassName("column")

For Each Strg4 In ddd
For ItemNumber4 = 1 To 600
Strg4 = ddd.Item(ItemNumber4).innerText
    If InStr(Strg4, "Projected Delivery Date:") >= 1 Then
    Strg4 = ddd.Item(ItemNumber4).innerText
    GoTo Line8
    Else
    End If
Next ItemNumber4
Next Strg4
MsgBox "Bad"
Exit Function
Line8:
TrackNEW = Strg4
Exit Function

Если кто-нибудь может объяснить, как исправить мой код, чтобы он подбирал дату? Опять же, я мог бы сделать getelementsbytagname для «div», но я хочу, чтобы это было по имени класса, если это возможно. Я использую VBA в Excel для этого. Это не Java-скрипт




Ответы (2)


Не уверен, почему вы можете зациклить весь элемент с классом column. Когда вы найдете тот, у которого Projected Delivery Date в качестве значения, выберите элемент по следующему индексу. Я использую селектор классов CSS, чтобы получить nodeList всех совпадающих элементов и зациклить их.

Dim nodeList As Object, i As Long
If htmlDoc Is Nothing Then Exit Sub
Set nodeList =htmlDoc.querySelectorAll(".column")
For i = 0 To nodeList.Length - 1
    If InStr(nodeList.item(i).innerText, "Projected Delivery Date") > 0 Then
        Debug.Print nodeList.item(i + 1).innerText
        Exit For
    End If
Next
person QHarr    schedule 02.10.2018

Что ж, у меня это работает, и оно считывает внутренний текст элементов с class="column", поэтому посмотрите, что вы делаете по-другому, и измените его, пока не заработаете. Также вы должны добавить «Библиотеку объектов Microsoft HTML» в проект в разделе «Инструменты»> «Ссылки».

Sub sub1()
Dim hdoc As HTMLDocument

' your test HTML
sHtml = "<div class=""column"">" & vbCrLf & _
vbCrLf & _
"Projected Delivery Date:" & vbCrLf & _
vbCrLf & _
"</div>" & vbCrLf & _
vbCrLf & _
"<div class=""column"">" & vbCrLf & _
vbCrLf & _
"11/28/2017" & vbCrLf & _
"</div>"

Set hdoc = New HTMLDocument
hdoc.body.innerHTML = sHtml

For Each element In hdoc.getElementsByClassName("column")
    Debug.Print element.innerText
Next
End Sub
person garbb    schedule 28.11.2017