【问题标题】:VBA, MSXML2.XMLHTTP60 parse in head sectionVBA,MSXML2.XMLHTTP60 在头部解析
【发布时间】:2018-05-03 15:28:43
【问题描述】:

我用这个来获取网页

Dim xhr As MSXML2.XMLHTTP60
Set xhr = New MSXML2.XMLHTTP60

On Error Resume Next

With xhr

    .Open "GET", URL, False
    .send

    If .ReadyState = 4 And .Status = 200 Then
        Set doc = New MSHTML.HTMLDocument
        doc.body.innerHTML = .responseText

        htmlRequestHTTP = True
    Else
        MsgBox "Internet Error, please check:" & vbNewLine & "Ready state: " & .ReadyState & _
        vbNewLine & "HTTP request status: " & .Status
        htmlRequestHTTP = False
    End If

End With

但是 doc.getElementsByTagName("META") 错过了 HEAD 部分的标签。 现在 .response 已完成(我检查过),那么我该如何访问 HEAD 元素? 谢谢,

【问题讨论】:

  • responseText 包含什么?如果元标记在 HTML 源代码中,doc.getElementsByTagName("META") 应该可以工作。
  • .responsetext 包含我需要的所有内容,但使用 doc.body.innerHTML = .responseText,文档显示为空 HEAD
  • doc.body

标签: vba


【解决方案1】:

不要写入文档正文。写入文档本身。

Set doc = New MSHTML.HTMLDocument
doc.write HttpGet(URL)
MsgBox doc.getElementsByTagName("META").length

辅助函数HttpGet:

Function HttpGet(url) As String
    With New MSXML2.XMLHTTP60
        .open "GET", url, False
        On Error Resume Next
        .send
        If .Status = 200 Then
            HttpGet = .responseText
        Else
            MsgBox "HTTP request status: " & .Status, , "HttpGet Error"
        End If
        On Error GoTo 0
    End With
End Function

作为一般提示,不要在下一个语句中使用On Error Resume Nextexcept

理想情况下,将可能失败的语句包装在一个专用函数中,以将On Error Resume Next 覆盖的代码区域保持在绝对最小值,就像我所做的那样。

【讨论】:

  • doc.write() 成功了,非常感谢。我已经尝试分配 doc = .response 没有成功。也感谢有关错误处理的提示。对于像我这样的 VBA 用户还有一个注意事项:如果您收到消息“函数或接口标记为受限,或者函数使用 Visual Basic 不支持的自动化类型”,则通过引用传递的文档必须声明为 Object -> ByRef doc作为对象而不是 MSXML2.DOMDocument。
  • @Tomalak 我在这一行遇到了错误doc.write
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2019-05-02
  • 2021-12-04
  • 2020-08-24
  • 2017-04-22
  • 2014-01-30
相关资源
最近更新 更多