【问题标题】:VBA Retrieve data from an HTML including spaceVBA 从包含空格的 HTML 中检索数据
【发布时间】:2019-12-01 15:37:09
【问题描述】:

这是相关的 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。但没有运气。 我还搜索了关键词,比如带间距的内部文本、getelementsbytagename 属性。也没有运气。

有人可以帮忙吗?非常感谢。

【问题讨论】:

  • 似乎 IE(与 IE 和 MSHTML 相同的引擎)正在自动删除这些空格。如果您在“立即”窗格中键入 oDom.body.innerHtml,您会看到它。

标签: html excel vba


【解决方案1】:

你本身不能。 HTML 解析器决定哪些空白是有用的、保留哪些以及删除哪些。稍后我会添加一些引用(如果我能找到的话),但就像在浏览器引擎中一样,在 HTML 解析器中有一些规则可以确定哪些空白字符是有用的。

请记住:

"Whitespace" is a mass noun

涵盖可能以不同方式处理的各种字符。

比较您的responseText 在通过 HTML 解析器后会发生什么:

查看如何删除被确定为无用的空白。您不能使用HTMLfile 的方法来获得您想要的结果,因为当HTML 被解析时为时已晚;并且没有晚绑定HTMLFile 或早绑定MSHTML.HTMLDocument 的设置可以改变这一点。您必须先查看其他字符串操作。例如,您可以使用 html 实体 &amp;nbsp;Chr$(32).responseText 执行替换$。或者,正如您所提到的,使用正则表达式来进行更有效的替换。

您可以使用以下命令生成上述图像输出:

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

This 给出了一个浏览器空白处理的例子。

This在css内容中讨论。

VBA HTML 解析器将早于当前的 HTML5 生活标准,但当前标准是 here。您可以查看this question 的答案以及相关的 cmets,例如:

@JasonWoof:HTML5 规范规定浏览器只能折叠 5 个 (ascii) 空白字符(空格、制表符、cr、lf、ff)。

【讨论】:

  • 感谢您的帮助和详细的解释。它确实帮助了我很多。我想我会先尝试替换方法。再次感谢您。
  • 我会试一试,看看您希望保留哪些各种空白字符,然后看看是否可以使用替换来使用 html 实体(例如 &amp;nbsp;
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2013-08-04
相关资源
最近更新 更多