Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-处理XMLHTTP GET请求中的JavaScript内容_Javascript_Excel_Vba_Xmlhttprequest - Fatal编程技术网

VBA-处理XMLHTTP GET请求中的JavaScript内容

VBA-处理XMLHTTP GET请求中的JavaScript内容,javascript,excel,vba,xmlhttprequest,Javascript,Excel,Vba,Xmlhttprequest,我想从网页中提取内容。然而,当我得到响应文本时,它包含JavaScript,它不能像浏览器打开的页面那样进行处理 此方法可以用于获取HTML内容,还是只有浏览器模拟可以提供帮助?或者可能有一些不同的方法来接收这些内容 Dim oXMLHTTP As New MSXML2.XMLHTTP Dim htmlObj As New HTMLDocument With oXMLHTTP .Open "GET", "http://www.manta.com/ic/mtqyfk0/ca/riverb

我想从网页中提取内容。然而,当我得到响应文本时,它包含JavaScript,它不能像浏览器打开的页面那样进行处理

此方法可以用于获取HTML内容,还是只有浏览器模拟可以提供帮助?或者可能有一些不同的方法来接收这些内容

Dim oXMLHTTP As New MSXML2.XMLHTTP
Dim htmlObj As New HTMLDocument

With oXMLHTTP
    .Open "GET", "http://www.manta.com/ic/mtqyfk0/ca/riverbend-holdings-inc", False
    .send

    If .ReadyState = 4 And .Status = 200 Then            
        htmlObj.body.innerHTML = .responseText
        'do things
    End If

End With
答复案文:

<!DOCTYPE html>
<head>
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="refresh" content="10; url=/distil_r_blocked.html?Ref=/ic/mtq599v/ca/45th-street-limited-partnership&amp;distil_RID=2115B138-A1BF-11E6-A957-C0595F6B962F&amp;distil_TID=20161103121454" />
<script type="text/javascript">
    (function(window){
        try {
            if (typeof sessionStorage !== 'undefined'){
                sessionStorage.setItem('distil_referrer', document.referrer);
            }
        } catch (e){}
    })(window);
</script>
<script type="text/javascript" src="/ser-yrbwqfedrrwwvctvyavy.js" defer></script><style type="text/css">#d__fFH{position:absolute;top:-5000px;left:-5000px}#d__fF{font-family:serif;font-size:200px;visibility:hidden}#verxvaxcuczwcwecuxsx{display:none!important}</style></head>
<body>
<div id="distil_ident_block">&nbsp;</div>
</body>
</html>

(功能(窗口){
试一试{
if(会话存储的类型!==“未定义”){
sessionStorage.setItem('distil_referer',document.referer);
}
}捕获(e){}
})(窗口);
#位置:绝对;顶部:-5000px;左侧:-5000px}字体系列:serif;字体大小:200px;可见性:隐藏}verxvaxcuczwcwecuxsx{显示:无!重要}

否-因为Javascript实际上是
标记中HTML的一部分。您必须对响应进行后期处理,以便自己删除标记

收到页面的HTML后,可以使用函数从DOM中删除
节点:

Function RemoveScriptTags(objHTML As HTMLDocument) As String

    Dim objElement As HTMLGenericElement

    For Each objElement In objHTML.all
        If VBA.LCase$(objElement.nodeName) = "script" Then
            objElement.removeNode
        End If
    Next objElement

    RemoveScriptTags = objHTML.DocumentElement.outerHTML

End Function
这可以包含在示例代码中,如下所示:

Option Explicit

Sub Test()

    Dim objXMLHTTP As New MSXML2.XMLHTTP
    Dim objHTML As Object
    Dim strUrl As String
    Dim strHtmlNoScriptTags As String

    strUrl = "http://www.manta.com/ic/mtqyfk0/ca/riverbend-holdings-inc"

    With objXMLHTTP
        .Open "GET", strUrl, False
        .send

        If .ReadyState = 4 And .Status = 200 Then
            Set objHTML = CreateObject("htmlfile")
            objHTML.Open
            objHTML.write objXMLHTTP.responseText
            objHTML.Close

            'do things
            strHtmlNoScriptTags = RemoveScriptTags(objHTML)
            Debug.Print strHtmlNoScriptTags

            'update html document with script-less document
            Set objHTML = CreateObject("htmlfile")
            objHTML.Open
            objHTML.write strHtmlNoScriptTags
            objHTML.Close

            'you can now operate on DOM of objHTML

        End If

    End With

End Sub

[通常]当服务器发送响应时,您得到的是它发送的内容。您不能请求“仅HTML”(除非服务器以某种方式配置为支持此功能,这似乎不太可能)。处理动态内容的唯一方法是通过浏览器自动化/selenium/etc。获取脚本的原因是它直接位于HTML文件中。下载内容后,可以使用HTML解析器删除脚本标记。关于如何解析DOM(),您可以参考以下线程。它删除了JS标记-是的,但如果我使用broswer,它无论如何都不允许我操作由该脚本生成的HTML文档。请查看我的编辑-我将函数的返回值固定为整个文档(更少的脚本)标记,并演示如何将此文本放回HTMLDocument,以便您可以使用DOM对象。