为什么MSXML2.ServerXMLHTTP响应不返回完整的html源代码?

时间:2014-02-26 23:22:20

标签: html vba

我想知道为什么MSXML2.ServerXMLHTTP对象的响应属性没有返回完整的html源代码。它似乎只返回“内部html”。我可以创建一个IE对象并获取“外部html”,但由于我有数百个搜索项目,因此效率不高。

我有下面显示的函数(带有URL),它将HTML内容分配给字符串。

Sub test()
    Dim myString As String
    myString = getECICS2("103-90-2") ' myString only contains inner html
End Sub

Public Function getECICS(ByVal casNum As String) As String
  Dim XMLhttp: Set XMLhttp = CreateObject("MSXML2.ServerXMLHTTP")
  XMLhttp.setTimeouts 2000, 2000, 2000, 2000
  XMLhttp.Open "GET", "http://ec.europa.eu/taxation_customs/dds2/ecics/chemicalsubstance_consultation.jsp?Lang=en&Cas=" & casNum & "&Cus=&CnCode=&EcCode=&UnCode=&Name=&LangNm=en&Inchi=&Characteristic=&sortOrder=1&Expand=true&offset=0&range=25", False
  XMLhttp.send
  If XMLhttp.Status = 200 Then
    getECICS = XMLhttp.responseText
  Else
    getECICS = ""
  End If
End Function

提前致谢

2 个答案:

答案 0 :(得分:1)

蒂姆已经击中了头部。一旦下载了html,网页就会使用javascript来更新页面。这会在浏览器中自动发生。

如果您运行下面的代码,它会将响应转储到html文件中,您可以在Chrome / IE / FF等中查看

Sub test()
    Dim myString As String
    myString = getECICS("103-90-2") ' myString only contains inner html
End Sub

Public Function getECICS(ByVal casNum As String) As String
  Dim XMLhttp: Set XMLhttp = CreateObject("MSXML2.ServerXMLHTTP")
  XMLhttp.setTimeouts 2000, 2000, 2000, 2000
  XMLhttp.Open "GET", "http://ec.europa.eu/taxation_customs/dds2/ecics/chemicalsubstance_consultation.jsp?Lang=en&Cas=" & casNum & "&Cus=&CnCode=&EcCode=&UnCode=&Name=&LangNm=en&Inchi=&Characteristic=&sortOrder=1&Expand=true&offset=0&range=25", False
  XMLhttp.send
  If XMLhttp.Status = 200 Then
    getECICS = XMLhttp.responseText
  Else
    getECICS = ""
  End If
  outputtext (getECICS)
End Function

Function outputtext(text As String)
Dim MyFile As String, fnum As String
        MyFile = ThisWorkbook.Path & "\" & "test.html"
        'set and open file for output
        fnum = FreeFile()
        Open MyFile For Output As fnum
        'use Print when you want the string without quotation marks
        Print #fnum, text
        Close #fnum
End Function

不幸的是,最简单的解决方案是在启用浏览器或脚本的解决方案中运行自动化以获取所需的数据。

现在,许多网站都使用javascript / AJAX / Login会话来控制资源的速度和访问权限,因此您不能总是通过不使用浏览器来获得所需的速度。

答案 1 :(得分:0)

请查看XMLHttpRequest ...

的其他方法

responseText以文本

的形式返回响应正文

responseXML将主体作为DOM对象返回

我认为你在追随:XMLhttp.response,它会返回整个回复。

或者可能:XMLhttp.responseBody

我不是完全确定这个'因为我自己只使用过C ++界面。

请参阅:http://msdn.microsoft.com/en-us/library/windows/apps/hh453379.aspx#methods