Очистка таблицы от локального HTML с использованием символов Юникода - PullRequest
0 голосов
/ 28 октября 2018

Я попробовал следующий код, чтобы очистить таблицу из локального файла HTML, хранящегося на моем ПК

Sub Test()
Dim mtbl            As Object
Dim tableData       As Object
Dim tRow            As Object
Dim tcell           As Object
Dim trowNum         As Integer
Dim tcellNum        As Integer
Dim webpage         As New HTMLDocument
Dim fPath           As String
Dim strCnt          As String
Dim f               As Integer

fPath = Environ("USERPROFILE") & "\Desktop\LocalHTML.txt"
f = FreeFile()
Open fPath For Input As #f
strCnt = Input(LOF(f), f)
Close #f

webpage.body.innerHTML = strCnt

Set mtbl = webpage.getElementsByTagName("Table")(0)
Set tableData = mtbl.getElementsByTagName("tr")
Debug.Print tableData.Item(0).innerText

On Error GoTo TryAgain:
trowNum = 1

For Each tRow In tableData
    For Each tcell In tRow.Children
        tcellNum = tcellNum + 1
        Sheet1.Cells(trowNum, tcellNum) = tcell.innerText
    Next tcell
    trowNum = trowNum + 1
    tcellNum = 0
Next tRow
Exit Sub

TryAgain:
Application.Wait Now + TimeValue("00:00:02")
Err.Clear
Resume
End Sub

Код работает без ошибок, но результаты неверны в двух точках. Сначала появляются символы на арабском языке.на листе в виде вопросительных знаков.Я имею в виду, что символы Юникода не читаются правильно. Второй момент: данные разбросаны по листу в неорганизованной структуре

Вот ссылка на локальный HTML-файл http://www.mediafire.com/file/oxpyzv4gc53kuwg/LocalHTML.txt

Спасибо за помощь

1 Ответ

0 голосов
/ 29 октября 2018

Итак, может быть, это немного поможет.Это не полный ответ, который я хотел бы дать.По сути, HTML это беспорядок (на мой взгляд).У вас нет данных, разложенных по строкам (tr), с ячейками таблицы (td) внутри, чтобы вы могли легко изолировать отдельные текстовые элементы.

Я предлагаюСледующее действительно только для того, чтобы продемонстрировать странности попыток изолировать отдельные компоненты текста и читать / писать с сохранением арабских символов.Я позаимствовал метод потока adodb у @ who , чтобы обеспечить UTF-8.

Этот метод, зацикливающий теги table и т. Д. С жестко закодированной нумерацией, является уродливым и действительно принадлежит к корзине с грехами.Я использую тот факт, что в более поздних таблицах ваши отдельные компоненты хранятся индивидуально, чтобы реконструировать общий вид таблицы со строками и столбцами.

Но вы можете получить что-то из этого:

Option Explicit

Public Sub test()
    Dim fStream  As ADODB.Stream, html As HTMLDocument
    Set html = New HTMLDocument
    Set fStream = New ADODB.Stream
    With fStream
        .Charset = "UTF-8"
        .Open
        .LoadFromFile "C:\Users\User\Downloads\LocalHTML.html"
        html.body.innerHTML = .ReadText
        .Close
    End With

    Dim hTables As Object, startTableNumber As Long, i As Long, r As Long, c As Long
    Dim counter As Long, endTableNumber, numColumns As Long

    startTableNumber = 43
    endTableNumber = 330
    numColumns = 9

    Set hTables = html.getElementsByTagName("table")
    r = 2: c = 1

    For i = startTableNumber To endTableNumber Step 2
        counter = counter + 1
        If counter = 10 Then
            c = 1: r = r + 1: counter = 1
        End If
        Cells(r, c) = hTables(i).innerText
        c = c + 1
    Next

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