VBA Извлечение данных из HTML, включая пробел - PullRequest
3 голосов
/ 01 декабря 2019

Вот соответствующий код HTML.

<tr style="background-color: #f0f0f0">
<td> </td><td> a</td><td>a </td><td>  </td><td>&nbsp;</td>
</tr>

Вот код VBA.

sub gethtmlspace() 

Dim trObj As MSHTML.HTMLGenericElement
Dim tdObj As MSHTML.HTMLGenericElement
Dim aRes As Variant, bRes As Variant
Dim temp1 As Long, Temp2 As Long, temp3 As Long, Temp4 As Long
Dim oDom As Object: Set oDom = CreateObject("htmlFile")
Dim oRow As MSHTML.IHTMLElementCollection, oCell As MSHTML.IHTMLElementCollection

temp1 = 0
Temp2 = 0

    With CreateObject("MSXML2.ServerXMLHttp")
        .Open "GET", "https://docs.google.com/spreadsheets/d/1Yh6WlJTDxbOLPVaVgzn_mk2OAKYVUYgfnT5Wz-8odi4/gviz/tq?tqx=out:html&tq&gid=1", False
        .send
        oDom.body.innerHTML = .responseText
    End With

Set oRow = oDom.getElementsByTagName("TR")
    ReDim aRes(0 To oRow.Length - 1, 0 To oRow(0).getElementsByTagName("TD").Length - 1)
    For Each trObj In oRow
        Set oCell = trObj.getElementsByTagName("td")
        For Each tdObj In oCell
            aRes(temp1, Temp2) = tdObj.innerText
            Temp2 = Temp2 + 1
        Next tdObj
        Temp2 = 0
        temp1 = temp1 + 1
    Next trObj

end sub

Я бы хотел, чтобы массив aRes содержал точное значение в коде HTML, т. Е.

aRes (1,0) должно быть равно пробелу "" Мои результаты становятся пустыми, т. Е. ""

aRes (1,1) должно быть равно пробелуи символ «a» Мои результаты получают только «a»

aRes (1,2) должно быть «a» этот код получен правильно.

aRes (1,3) должно быть равно двум пробелам "" Мои результаты становятся пустыми, т. Е. ""

aRes (1,4) должно быть равно пустому Мои результаты получают пробел, т. Е. ""

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

Я попытался использовать innerhtml, outertext, outerhtml, textcontent вместо innertext. Но не повезло. Я также гуглил ключевые слова, такие как innertext с пробелами, getelementsbytagame свойства. Тоже не повезло.

Может кто-нибудь помочь, пожалуйста. Большое вам спасибо.

1 Ответ

2 голосов
/ 01 декабря 2019

Вы не можете сами по себе. Синтаксический анализатор HTML решает, какие пробелы полезны, а какие оставить, а какие удалить. Я добавлю некоторые ссылки позже (если я смогу их найти), но, как и в движке браузера, в анализаторе HTML есть правила, определяющие, какие пробельные символы полезны.

Помните, что:

«Пробел» - это массовое существительное

, охватывающее различные символы, которые могут обрабатываться по-разному.

Сравните, что происходит с вашимresponseText после того, как он прошел через анализатор HTML:

image

Посмотрите, как удаляются пробелы, определенные как бесполезные. Вы не можете использовать метод HTMLfile, чтобы получить желаемый результат, так как к тому времени, когда HTML был проанализирован, уже слишком поздно;и нет настройки с поздней границей HTMLFile или ранней границей MSHTML.HTMLDocument, которая бы изменила это. Сначала вам придется обратиться к другим манипуляциям со строками. Например, вы можете заменить $ на .responseText из Chr$(32) на html-сущность &nbsp;. Или используйте regex, как вы упомянули, чтобы сделать более эффективный набор замен.

Вы можете сгенерировать вышеприведенные выходные данные изображения с помощью:

Option Explicit

Public Sub ExamineHtmlWhenParsed()
    Dim oDom As Object: Set oDom = CreateObject("htmlFile")

    With CreateObject("MSXML2.ServerXMLHTTP")
        .Open "GET", "https://docs.google.com/spreadsheets/d/1Yh6WlJTDxbOLPVaVgzn_mk2OAKYVUYgfnT5Wz-8odi4/gviz/tq?tqx=out:html&tq&gid=1", False
        .send
        oDom.body.innerHTML = .responseText
        WriteTxtFile .responseText, "C:\Users\User\Desktop\input.txt"
        WriteTxtFile oDom.body.innerHTML, "C:\Users\User\Desktop\parsed.txt"
    End With

End Sub

 Public Sub WriteTxtFile(ByVal aString As String, ByVal filePath As String)
    Dim fso As Object, Fileout As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Fileout = fso.CreateTextFile(filePath, True, True)
    Fileout.Write aString
    Fileout.Close
End Sub

Это даетрабочий пример браузер обработка пробелов.

В этом обсуждается это в содержании CSS.

Анализаторы VBA HTML будут старше, чемтекущий уровень жизни HTML5, но текущий стандарт здесь . Вы можете просмотреть ответы, данные на этот вопрос и соответствующие комментарии, например:

@ JasonWoof: Спецификация HTML5 говорит, что браузеры должны свернуть только 5 (ascii) пробельных символов (пробел,tab, cr, lf, ff).

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