VBA从包含空格的HTML中检索数据

时间:2019-12-01 15:37:09

标签: html excel vba

这是相关的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数组在HTMLcode中包含确切的值,即

aRes(1,0)应该等于一个空格“” 我的结果即为空。“”

aRes(1,1)应该等于一个空格,并且字符为“ a”。我的结果只有一个“ a”

aRes(1,2)应该是“ a”。已正确检索到此。

aRes(1,3)应该等于两个空格“” 我的结果为空,即。“”

aRes(1,4)应该等于空我的结果得到一个空格,即。”“

我知道我可以使用正则表达式来完成任务。但是,我想使用getelementsbytagname方法以一种简单的方式做到这一点。

我尝试使用innerhtml,externaltext,outerhtml,textcontent而不是innertext。但是没有运气。 我还用谷歌搜索关键字,例如带间隔的内部文本,getelementsbytagename属性。也没有运气。

请有人帮忙。非常感谢。

1 个答案:

答案 0 :(得分:2)

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

请记住:

  

"Whitespace" is a mass noun

发现可能处理不同的各种字符。

比较responseText经过HTML解析器后的情况:

查看如何确定空白不可用。您无法使用HTMLfile的方法来获得所需的结果,因为到HTML解析时为时已晚。并且没有使用后期绑定HTMLFile或早期绑定MSHTML.HTMLDocument的设置来更改此设置。您将必须首先考虑其他字符串操作。例如,您可以使用HTML实体.responseTextChr$(32)的{​​{1}}进行替换$。或者,如您所述,使用正则表达式进行更有效的替换。

您可以使用以下方法生成上述图像输出:

&nbsp;

This给出了浏览器空白处理的工作示例。

This在CSS内容中进行了讨论。

VBA HTML解析器将早于当前的HTML5活动标准,但当前标准为here。您可以查看对{​​{3}}的回答以及相关的评论,例如:

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

相关问题