Как извлечь текст из элемента div под многочисленными элементами? - PullRequest
0 голосов
/ 29 января 2019

pastebin.com / p9m5tMMw

Здравствуйте, я пытаюсь удалить данные с сайта.Я приложил код с помощью вставки бин.Однако текст, например, "NET SALES", который мне нужен, находится под tr, затем td, затем div.Я с трудом извлекаю эти данные.Если это ЧИСТЫЕ ПРОДАЖИ, я бы хотел получить значение div внутри 4-го тд.Я приложил код, который у меня есть.Сгенерированный отчет также является динамическим, поэтому сложно определить правильный идентификатор для него.Можно использовать идентификатор таблицы "ctl00_cpMain_rptMain_fixedTable", но я не могу получить код для навигации по всем этим элементам, чтобы получить tbody, содержащий tr и элементы, которые мне нужны.Спасибо

Sub GetData()
Dim IE As Object
Dim ListOfRows As Object
Dim CellsInsideRow As Object
Dim DivsInsideCell As Object
Dim StrInsideDiv As Object
Dim tRows As Object
Dim tCells As Object
Dim tDivs As Object
Dim Content As Object
Dim ContentArea As Object
Dim ThingInDiv As Object
Dim tThings
Dim t As Integer
Dim s As String
Dim Tbody As Object


Dim ttDivs As HTMLDivElement
Dim DivsInsideOfDivs As Object



Set IE = CreateObject("InternetExplorer.Application")


'Dim IE As SHDocVw.InternetExplorer'
Dim HtmlDoc As MSHTML.HTMLDocument
Dim htmlinput As MSHTML.IHTMLElement

Set IE = New SHDocVw.InternetExplorer

' Open Home Page'
With IE

    .Visible = True
    .navigate "https://ballout.sage-nexgen.com/report/SDateXParam.aspx?r=204"
    Do While IE.readyState <> READYSTATE_COMPLETE
    Loop

End With
' Identify Source Code'
Set HtmlDoc = IE.document

'Mention this bug'

' Input Username and Password'
'On Error Resume Next
'IE.document.forms("aspnetForm").elements("ctl00$cpMain$logMain$UserName").Value = "**********"
'IE.document.forms("aspnetForm").elements("ctl00$cpMain$logMain$Password").Value = "******"
'IE.document.forms("aspnetForm").elements("ctl00$cpMain$logMain$LoginButton").Click

Do While IE.Busy
    DoEvents
Loop
IE.document.forms("aspnetForm").elements("ctl00$cpMain$clbStores$0").Click
Do While IE.Busy
    DoEvents
Loop

IE.document.forms("aspnetForm").elements("ctl00$cpMain$StartDate").Value = Range("A1").Text '

Do While IE.Busy
    DoEvents
Loop

IE.document.getElementById("ctl00_cpMain_cmdRun2").Click
Do While IE.Busy
    DoEvents
Loop


On Error Resume Next
Set ListOfRows = IE.document.getElementsByTagName("tr")
Debug.Print ListOfRows.Length
For Each tRows In ListOfRows

    Set CellsInsideRow = tRows.getElementsByTagName("td")
    For Each tCells In CellsInsideRow
        Set DivsInsideCell = tCells.getElementsByTagName("div")
        For Each tDivs In DivsInsideCell
           Set ttDivs = tDivs
           'If Trim(ttDivs.innerText) = "AVERAGE NET SALE" Then

            'Debug.Print Trim(ttDivs.innerText)
            'End If

        Next tDivs
    Next tCells
Next tRows







'Set ListOfRows = Content.getElementsByTagName("tr")
'MsgBox (Len(ListOfRows))
'For Each tRows In ListOfRows
 '  Set CellsInsideRow = tRows.getElementsByTagName("td")
  ' For Each tCells In CellsInsideRow
   '
    '    Set DivsInsideCell = tCells.getElementsByTagName("div")



    'Next tCells
'Next tRows


End Sub

Информация

Ответы [ 2 ]

0 голосов
/ 29 января 2019

У вас есть вложенные таблицы, но в вашем html есть таблица с идентификатором content, которая содержит всю информацию.Вы можете собрать строки (tr) в этой таблице и выполнить цикл поиска интересующей строки.Если вы используете .innerText в строке, вы получите финансовую сумму вместе с текстовым описанием.В противном случае вы можете извлечь дополнительную информацию из элементов td в строке.Примерно так:

Dim html As HTMLDocument, tableRows As Object, i As Long, rowOfInterest As Object
Set html = ie.document
Dim a As Object
Set tableRows = html.querySelectorAll("#content tr")
For i = 0 To tableRows.Length - 1
    If InStr(tableRows.Item(i).innerText, "NET SALES") > 0 Then
        Set rowOfInterest = tableRows.Item(i)
        Exit For
    End If
Next
If Not rowOfInterest Is Nothing Then
    Debug.Print tableRows.Item(i).innerText
    Debug.Print tableRows.Item(i).getElementsByTagName("td")(1).innerText
End If

Пример информации о строке:

enter image description here

Значения заполняются через JavaScript, поэтому вам нужновыделить достаточно времени для населения.

0 голосов
/ 29 января 2019

HTML немного беспорядок.Внутри целевого объекта HTMLTableCell находится еще одна таблица и множество элементов div внутри этих таблиц.Я бы просто разделил цель cells.InnerText на разрывы строк и обработал данные разделения.Это будет намного проще, чем пытаться расшифровать этот HTML.

Sub ProcessData(IE As InternetExplorerMedium)
    Const AverageNetSalesText As String = "AVERAGE NET SALE"
    Dim doc As HTMLDocument, tbl As HTMLTable, ListRows As Object, tr As HTMLTableRow, td As HTMLTableCell
    Dim data As Variant
    Set doc = IE.Document
    Set tbl = doc.getElementById("ctl00_cpMain_rptMain_fixedTable")
    Set ListRows = tbl.getElementsByTagName("TR")

    For Each tr In ListRows
        If tr.Cells.Length >= 2 Then
            Set td = tr.Cells(2)
            If Not td Is Nothing Then
                If InStr(td.innerText, "AVERAGE") > 0 Then
                    data = Split(td.innerText, vbNewLine)

                    Dim AverageNetSales As Single
                    If UBound(data) >= 15 Then
                        If InStr(data(15), AverageNetSalesText) > 0 Then
                            data(15) = Trim(data(15))
                            AverageNetSales = Right(data(15), Len(data(15)) - Len(AverageNetSalesText))
                            'Do something
                            Range("A17") = AverageNetSales
                            Exit Sub
                        End If
                    End If
                End If
            End If
        End If
    Next

End Sub

enter image description here

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