Извлечение данных из таблицы веб-страниц с использованием VBA - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы извлечь данные из таблицы на веб-странице.мой HTML-код таблицы выглядит так:

<table class=table_x_write cellspacing=1
bordercolordark=#d5d5d5 cellpadding=0 width="100%"
align=center bgcolor=#FFFFFF bordercolorlight=#a5a5a5
border=1>
<tr>
    <td class="title_1" align="right" width="20%">
        <div align=right>case number:</div></td>
    <td class="item_1" width="30%"><input type="text" name="sgdabh" tabindex="1" value="3710140068" readonly="readonly" style="width:98%" class="bg0" id="sgdabhD"></td>
    <TD class="title_1" align="right">participant number:</td>
    <td class="item_1" width="30%"><span
        onmouseover="setEnabled('cyfbh',1)"
        onmouseout="setEnabled('cyfbh',2)"> <select name="cyfbh" style="width:100%"><option value=""></option>
        <option value="371014006801" selected="selected">371014006801-passenger car</option>
        <option value="371014006802">371014006802-two/three wheeled motorcycle</option></select> </span></td>

</tr>
<tr>
    <TD class="title_1" align="right">licence number - city:</td>
    <TD class="item_1"><input type="text" name="cph_cs" value="豫" style="width:98%" class="bg0"></TD>
    <TD class="title_1" align="right">licence number - letter:</td>
    <td class="item_1"><input type="text" name="cph_zm" maxlength="5" tabindex="6" value="C" style="width:98%" class="bg0"></td>
</tr>
<tr>
    <TD class="title_1" align="right">licence number - number:</td>
    <TD class="item_1"><input type="text" name="cph_sz" maxlength="5" value="8****" style="width:98%" class="bg0"></TD>
    <TD class="title_1" align="right">type of vehicle (own definition):</td>
    <td class="item_1"><span
        onmouseover="setEnabled('cllx1',1)"
        onmouseout="setEnabled('cllx1',2)"> <select name="cllx1" style="width:100%"><option value=""></option>
        <option value="2">2-two/three electric wheeler</option>
        <option value="3" selected="selected">3-passenger car(≤9 seats)</option>
        <option value="4">4-HGV</option>
        <option value="5">5-bus(>9 seats)</option>          
        <option value="6">6-military vehicle</option></select> </span>
    </td>
</tr>
</table>

Я пробовал ниже код

Sub data()
   x = 0
   Set objShell = CreateObject("Shell.Application")
   For Each w In objShell.Windows
       If w.Name = "Internet Explorer" And w.LocationName = "vehicle data"  Then
        Set externalIE = objShell.Windows(x)
        Set externalIEDoc = externalIE.Document
        Set elemCollection = externalIE.Document.getElementsByTagName("TABLE")
        MsgBox (elemCollection.Length)
        For t = 0 To (elemCollection.Length - 1)
            For r = 0 To (elemCollection(t).Rows.Length - 1)
                For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
                    ThisWorkbook.Worksheets(1).Cells(r + 1, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
                Next c
            Next r
        Next t
        MsgBox (w.LocationName)
        externalIEDoc.getelementsbyname("btnDown")(0).Click
    End If
    x = x + 1
Next
End Sub

, но я получаю ненужные данные.Мне нужно значение в качестве номера дела: 3710140068 номер участника: 371014006801-легковой автомобиль Мне нужно извлечь данные из текста и выбранной опции.Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Что вы подразумеваете под «мусорными данными»?

Для извлечения данных из таблицы в HTML-коде я бы использовал вот что:

Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim FilePath As String

Dim SHT as Worksheet

Dim HTMLTable As MSHTML.IHTMLElement
Dim HTMLTables As MSHTML.IHTMLElementCollection

Dim HTMLRow As MSHTML.IHTMLElement
Dim HTMLCell As MSHTML.IHTMLElement

Dim RowNum, counter As Long, ColNum As Integer

XMLPage.Open "GET", WEbsite URL, False
XMLPage.send

HTMLDoc.body.innerHTML = XMLPage.responseText
' Debug.Print HTMLDoc.body.innerHTML might use this line to check the 
'content of inner text
Set HTMLTables = HTMLDoc.getElementsByTagName("table")
Debug.Print HTMLTables.Length
Workbooks.Add
For counter = 0 To HTMLTables.Length - 1
    Set HTMLTable = HTMLDoc.getElementsByTagName("table")(counter)
    Debug.Print counter 'to explore how many tables are in this HTML code
    Set SHT = ActiveWorkbook.Worksheets.Add
    SHT.Name = "DataFromTable"
    RowNum = 1
    For Each HTMLRow In HTMLTable.getElementsByTagName("tr")
        ColNum = 1
        For Each HTMLCell In HTMLRow.Children 'Using this expression
    '<td> is a child of HTMLRow, and then HTMLCell suppose to get you deeper 
    'into the code probably to the data you are looking for
            Cells(RowNum, ColNum) = HTMLCell.innerText
            ColNum = ColNum + 1
        Next HTMLCell
        RowNum = RowNum + 1
    Next HTMLRow
    Set SHT = Nothing
    Set HTMLTable = Nothing
    Set HTMLRow = Nothing
    Set HTMLCell = Nothing
Next counter

Если бы вы могли опубликовать оригинальный URL сайта, это было бы проще.

0 голосов
/ 11 мая 2018

Вам нужно больше, чем вы получаете от следующего (Примечание: здесь я читаю ваш HTML из ячейки в HTML-документ. Вы сделали бы это обычным способом.). Очевидно, что он не очень надежный, но я не думаю, что вы просто зацикливаете строки, затем столбцы внутри, и делаете HTMLCell.innerText


Ранняя оценка:

Код:

Option Explicit

Public Sub GetTableInfo()
    Dim html As HTMLDocument
    Set html = New HTMLDocument
    html.body.innerHTML = [A1].Text '<== You would obtain in normal way. I just read your HTML in from sheet.

    Debug.Print "Case number: " & html.querySelectorAll("table tr td[class=""item_1""] input")(0).Value
    Debug.Print "licence number - city: " & html.querySelectorAll("table tr td[class=""item_1""] input")(1).Value
    Debug.Print "licence number - letter: " & html.querySelectorAll("table tr td[class=""item_1""] input")(2).Value
    Debug.Print "licence number - number: " & html.querySelectorAll("table tr td[class=""item_1""] input")(3).Value
    Debug.Print "participant number: " & html.querySelectorAll("table tr td[class=""item_1""] option[selected=""selected""]")(0).innerText
    Debug.Print "type of vehicle (own definition): " & html.querySelectorAll("table tr td[class=""item_1""] option[selected=""selected""]")(1).innerText

End Sub

Версия с поздним связыванием для OP:

Не глядя на более широкий контекст HTML, здесь есть немного хрупкий фрагмент кода:

Option Explicit

Public Sub GetTableInfo()
    Dim html As Object
    Set html = CreateObject("htmlfile")

    html.body.innerhtml = [A1].Text              '<== You would obtain in normal way. I just read your HTML in from sheet.

    html.getElementsByTagName ("table")
    Dim b As Object
    Set b = html.getElementsByTagName("table")(0).getElementsByTagName("input")

    Debug.Print "Case number = " & b(0).Value
    Debug.Print "licence number - city:  = " & b(1).Value
    Debug.Print "licence number - letter = " & b(2).Value
    Debug.Print "licence number - number = " & b(3).Value

    Dim c As Object
    Set c = html.getElementsByTagName("table")(0).getElementsByTagName("option")

    Dim i As Long, n As Long

    For i = 0 To c.Length - 1
        If InStr(c(i).outerHTML, "selected value=") > 0 Then
            n = n + 1
            If n = 1 Then
                Debug.Print "participant number: " & c(i).innerText
            ElseIf n = 2 Then
                Debug.Print "type of vehicle (own definition) " & c(i).innerText
            End If
        End If
    Next i

End Sub

Выход:

Это то же самое, что и с .querySelector.

Output

К сожалению, 豫 выходит как?


Разбор HTML:

Вы также можете анализировать HTML. Приспособьте к своему фактическому полному HTML, но вот как вы можете сделать это с помощью предоставленного фрагмента:

Dim arr() As String
arr = Split([A1].Text, "class=""item_1""")
Debug.Print "Case number = " & Split(Split(arr(1), "value=")(1), Chr(32))(0)
Debug.Print "participant number: " & Split(Split(Split(arr(2), "value=")(2), "selected=""selected"">")(1), "<")(0)
Debug.Print "licence number - city:  = " & Split(Split(arr(3), "value=")(1), Chr(32))(0)
Debug.Print "licence number - letter = " & Split(Split(arr(4), "value=")(1), Chr(32))(0)
Debug.Print "licence number - number = " & Split(Split(arr(5), "value=")(1), Chr(32))(0)
Debug.Print "type of vehicle (own definition) " & Split(Split(arr(6), "selected=""selected"">")(1), "<")(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...