在VBA中将HTML转换为纯文本

10

我有一个包含HTML代码的Excel表格。如何批量将它们转换为纯文本?目前有太多无用的标记和样式。如果我能够获得纯文本,那么重写它会更容易。

我可以编写一个在PHP中将HTML转换为纯文本的脚本,所以如果你想不到VBA的解决方案,那么也许你可以建议我如何将单元格数据传递到网站并检索数据。

6个回答

18

设置对 "Microsoft HTML 对象库" 的引用。

Function HtmlToText(sHTML) As String
  Dim oDoc As HTMLDocument
  Set oDoc = New HTMLDocument
  oDoc.body.innerHTML = sHTML
  HtmlToText = oDoc.body.innerText
End Function

蒂姆


1
这个很好用,但要注意空格会被压缩。例如 <div>this[space][space][space]is</div><div>a[space]test</div> 输出为 this[space]isa[space]test。(对格式不太好的抱歉;当我只是打字时,额外的空格并没有出现。) - Cheran Shunmugavel
在这里,我认为折叠空格将是“预期行为”(除非元素文本已使用CSS样式保留空格)。 - Tim Williams

5
一种非常简单的提取文本的方法是逐个字符扫描HTML,并将尖括号外的字符累积到一个新字符串中。
Function StripTags(ByVal html As String) As String
    Dim text As String
    Dim accumulating As Boolean
    Dim n As Integer
    Dim c As String

    text = ""
    accumulating = True

    n = 1
    Do While n <= Len(html)

        c = Mid(html, n, 1)
        If c = "<" Then
            accumulating = False
        ElseIf c = ">" Then
            accumulating = True
        Else
            If accumulating Then
                text = text & c
            End If
        End If

        n = n + 1
    Loop

    StripTags = text
End Function

这可能会留下许多无关的空格,但有助于去除标签。

1
请注意这种方法。如果输入文本中包含<或>字符,而不是标签,则会混淆。 - Ben

5

Tim的解决方案非常好,非常有效。

我想做出贡献:使用以下代码在运行时添加“Microsoft HTML对象库”:

Set ID = ThisWorkbook.VBProject.References
ID.AddFromGuid "{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}", 2, 5

它可以在Windows XP和Windows 7上运行。


你能展示一个例子,说明如何在Tim的代码和Option Explicit一起使用吗? - Ben
仍在Windows 10上工作。谢谢你。 - Clyde

2

Tim的回答非常好。然而,可以添加一个小调整以避免一个可预见的错误响应。

 Function HtmlToText(sHTML) As String
      Dim oDoc As HTMLDocument

      If IsNull(sHTML) Then
        HtmlToText = ""
        Exit Function
        End-If

      Set oDoc = New HTMLDocument
      oDoc.body.innerHTML = sHTML
      HtmlToText = oDoc.body.innerText
    End Function

2
这是Tim和Gardoglee的解决方案的一个变体,不需要设置对“Microsoft HTML object library”的引用。这种方法被称为后期绑定,在vbscript中也可以使用。
Function HtmlToText(sHTML) As String

    Dim oDoc As Object ' As HTMLDocument

    If IsNull(sHTML) Then
        HtmlToText = ""
        Exit Function
    End If

    Set oDoc = CreateObject("HTMLFILE")
    oDoc.body.innerHTML = sHTML
    HtmlToText = oDoc.body.innerText

End Function

请注意,如果您在使用Access 2007或更高版本中的VBA,则内置了一个Application.PlainText()方法,其执行与上述代码相同。

我喜欢Application.PlainText()函数! - Combinatix

1
是的!我也成功解决了我的问题。谢谢大家。
在我的情况下,我的输入是这样的:
<p>Lorem ipsum dolor sit amet.</p>

<p>Ut enim ad minim veniam.</p>

<p>Duis aute irure dolor in reprehenderit.</p>

我不希望结果没有换行就挤在一起。
所以,我首先将输入按每个<p>标签拆分成一个名为“段落”的数组,然后对于每个元素,我使用Tim的答案从HTML中获取文本(非常不错的答案)。
此外,我将每个已清理的“段落”与此换行字符Crh(10)连接起来,用于VBA/Excel。
最终代码如下:
Public Function HtmlToText(ByVal sHTML As String) As String
    Dim oDoc As HTMLDocument
    Dim result As String
    Dim paragraphs() As String

    If IsNull(sHTML) Then
      HtmlToText = ""
      Exit Function
    End If

    result = ""
    paragraphs = Split(sHTML, "<p>")

    For Each paragraph In paragraphs
        Set oDoc = New HTMLDocument
        oDoc.body.innerHTML = paragraph
        result = result & Chr(10) & Chr(10) & oDoc.body.innerText
    Next paragraph

    HtmlToText = result
End Function


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接