如何处理 VBA 中 HTML 变量的 MailChimp API 响应?

Posted

技术标签:

【中文标题】如何处理 VBA 中 HTML 变量的 MailChimp API 响应?【英文标题】:How do I handle the MailChimp API response for the HTML variable in VBA? 【发布时间】:2019-01-30 09:29:36 【问题描述】:

字符串变量 oldhtmlContent 包含来自 MailChimp API 请求响应的文本字符串,表示电子邮件活动的当前内容。这是字符串,但它包含一堆您在下面的显示中看不到的 \r\n:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <style type="text/css">
      @media only screen and (max-width: 480px) 
        table#canspamBar td 
          font-size:14px !important;
        
        
        table#canspamBar td a 
          display:block !important;
          margin-top:10px !important;
        
      
    </style>
  </head>
  <body>
    <p> </p>
    <div class="userBot">
      <a href="http://dev.mydev.org/why-so-many-people-are-signing-up-for-cynthia-for-new-york-volunteer-events"><img src="http://dev.mydev.org/wp-content/uploads/2018/07/CynthiaNixon.jpg"   ></a>
      <p>When we ask ourselves why so many people are signing up for Cynthia For New York volunteer events this weekend, this is what ... (click for more)</p>
    </div>            <center>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <table border="0" cellpadding="0" cellspacing="0"  id="canspamBarWrapper" style="background-color:#FFFFFF;border-top:1px solid #E5E5E5;">
      <tr>
        <td align="center" valign="top" style="padding-top:20px;padding-bottom:20px;">
          <table border="0" cellpadding="0" cellspacing="0" id="canspamBar">
            <tr>
              <td align="center" valign="top" style="color:#606060;font-family:Helvetica, Arial, sans-serif;font-size:11px;line-height:150%;padding-right:20px;padding-bottom:5px;padding-left:20px;text-align:center;">
                This email was sent to <a href="mailto:*|EMAIL|*" target="_blank" style="color:#404040 !important;">*|EMAIL|*</a>
                <br><a href="*|ABOUT_LIST|*" target="_blank" style="color:#404040 !important;"><em>why did I get this?</em></a>    <a href="*|UNSUB|*" style="color:#404040 !important;">unsubscribe from this list</a>    <a href="*|UPDATE_PROFILE|*" style="color:#404040 !important;">update subscription preferences</a>
                <br>*|LIST:ADDRESSLINE|*
                <br>
                <br>
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
  </center>
</body>
</html>

我只想提取“userBot”类,但似乎无法使用 getElementsByClassName 访问它。

执行此代码时,结果始终为零。

Dim oldHTMLContent As String
Dim oldHtmlDoc As MSHTML.HTMLDocument
Set oldHtmlDoc = New HTMLDocument
oldHtmlDoc.body.innerText=oldHTMLContent
debug.Print oldHtmlDoc.getElementsByClassName("userBot").length

如何定义正确的对象并使用 HTML 字符串加载它,以便可以使用 userBot 类?我可以看到我正在加载整个 DOM,包括

【问题讨论】:

getElementsByClassName() 返回一个集合。因此,您需要遍历集合或指定索引,例如getElementsByClassName("userBot")(0)。换句话说,您可以拥有多个 userBot 类 - 这不是唯一值(因此,getElements 末尾的“s”)。这与 getElementByID() 不同,后者的 ID 始终是唯一值。 但我正在使用 getElementsByClassName 并且它返回的长度为零 【参考方案1】:

.innerHTML 转换为新的HTMLDocument,然后使用CSS 类选择器".",如下所示。此外,您的命名似乎有点混乱。如果您将oldInnerHTML 转移到newHTMLDoc 或类似的东西,IMO 会更清楚。

Option Explicit
Public Sub test()
    Dim html As New HTMLDocument

    html.body.innerHTML = [A1] '<= This is your oldHTMLContent. I am reading from a cell.
    Debug.Print html.querySelector(".userBot").innerText
End Sub

这和说的一样:

Debug.Print html.getElementsByClassName("userBot")(0).innerText

输出示例:

【讨论】:

以上是关于如何处理 VBA 中 HTML 变量的 MailChimp API 响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 VBA 中的复选框值?

文件保存期间如何处理和提示文件名(Word 2016,VBA)

如何处理 Access 表中的数组

Access表单中如何处理点击功能

一个页面跳转到另一个页面的tab选项卡的指定页上,该如何处理

Python反射机制中参数问题如何处理?