Извлечь значение из HTML Source - PullRequest
1 голос
/ 24 апреля 2020

У меня был макрос, который использовался для go, чтобы веб-сайт извлекал значение из столбца A, например 517167000, из определенной части кода и возвращал это значение в ячейку. Источник html изменился, и я не могу заставить его работать.

Мой оригинальный код был

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    UnitPerBox = Trim(Split(Split(.responseText, "Units per box</td>")(1), "<tr")(0))
End With

End Function

Итак, рабочий пример сайта:

https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-517167000

Так что вы можете go перейти на сайт и просмотреть источник. Новый код html выглядит так, как показано ниже, но так долго я не делал оригинальный макрос, что я предположил, что могу изменить

"Units per box</td>")(1), "<tr" 

на

"Units per pack</td> <td class="value">")(1), "<tr"

как приведенный ниже новый html код - это то, что сейчас находится на сайте, и мне нужно, например, значение 2,74, но оно не работает.

<tr>
                <td class="name">Units per pack</td>
                <td class="value">2.74</td>
            </tr>

Любая помощь будет принята с благодарностью.

Пример Приветствия

1 Ответ

1 голос
/ 24 апреля 2020

Если вы go и работаете с .responseText, используя Split(), выполняете манипуляции с текстом, вы также можете использовать регулярное выражение без установки параметра Global:

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")

Dim RegEx As Object
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "\d+(?:\.\d+)?"

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    UnitPerBox = RegEx.Execute(Split(.responsetext, "Units per pack</td>")(1))(0)
End With

End Function

Neater (IMO), однако, состоит в том, чтобы полностью избегать манипулирования текстом на .responseText и работать с документом HTML, извлекать соответствующие данные из таблицы HTML по идентификатору элемента и индексам таблицы:

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")
Dim htmlResponse As Object: Set htmlResponse = CreateObject("htmlfile")

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    htmlResponse.body.innerHTML = .responseText
    UnitPerBox = htmlResponse.body.document.getElementById("specifications").getElementsByTagName("tr")(10).getElementsByTagName("td")(1).innerText
End With

End Function

Обратите внимание, что таблица имеет индекс 0, что означает, что мы на самом деле получаем наше значение из 11-й строки второго столбца. Если вы не уверены, что содержание таблицы всегда находится в одних и тех же индексах, вы также можете просто l oop дочерних узлов:

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")
Dim htmlResponse As Object: Set htmlResponse = CreateObject("htmlfile")
Dim Rws As Object

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    htmlResponse.body.innerHTML = .responseText
    Set Rws = htmlResponse.body.document.getElementById("specifications").getElementsByTagName("tr")
    For Each Rw In Rws
        If Rw.getElementsByTagName("td")(0).InnerText = "Units per pack" Then
            UnitPerBox = Rw.getElementsByTagName("td")(1).InnerText
            Exit For
        End If
    Next
End With

End Function

Где я лично предпочел бы использовать документ HTML поверх манипулирование текстом, все вышеперечисленные опции работают для получения вашего значения =)

...