xmlHTTP代码并不适用于所有url



下面的代码(基于-在Excel中使用VBA在IE中搜索并返回第一个结果的超链接,由@Santosh)似乎为几乎所有url打印getelementsbytagname("a")。事实证明,它不为一些和示例URL在代码中给出(weatherford.com)…除非我注释掉第z行,有什么原因吗?

注意:要打印carmax的链接,请按原样运行代码。要打印weatherford的链接,请注释掉第1a和2a行,取消注释第1b和2b行。运行宏,它将为weatherford链接打印一个空白的。txt文档。现在删除桌面上的weatherfordlinks.txt文件,注释掉Zz行并运行宏…它现在将打印weatherford链接。

Sub testxmlhttp()
Dim xmlHttp As Object, myURL As String, html As Object, lnk As Object, links As Object
myURL = "http://www.carmax.com/"         '-->1a
'myURL = "http://www.weatherford.com"    '-->1b
Set xmlHttp = CreateObject("MSXML2.serverXMLHTTP")
xmlHttp.Open "GET", myURL, False
xmlHttp.setRequestHeader "Content-Type", "text/xml"    '-->Zz
xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
On Error Resume Next
xmlHttp.Send
Set html = CreateObject("htmlfile")
On Error Resume Next
html.body.innerHTML = xmlHttp.responseText
Open "C:Users~desktopcarmaxLinks.txt" For Output As #1          '-->2a
'Open "C:Users~desktopweatherfordLinks.txt" For Output As #1    '-->2b
For Each lnk In html.getelementsbytagname("a")
Print #1, lnk
Next
Close #1
End Sub

这不是一个确切的答案,而更像是一个评论,因为我缺乏足够的声誉来评论。

该问题可以使用Fiddler进行分析,Fiddler提供了请求和响应的详细信息。当文件作为web请求的一部分被上传时,服务器需要Content-Type报头来识别媒体类型。对于简单的请求,不需要这个头。

如果Content-Type报头指定为tex/xml,则weatherford服务器期望SOAP请求具有适当的xml请求体。响应如下:

<?xml version='1.0' encoding='utf-8' ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>Client</faultcode>
<faultstring>The SOAP request is invalid. The required node 'Envelope' is missing.</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

由于没有SOAP请求体,它不返回任何值。

carmax服务器不查找SOAP请求,因此不会根据Content-Type报头改变响应。

在这两种情况下,省略代码的xmlHttp.setRequestHeader "Content-Type", "text/xml" '-->Zz部分应该得到结果。

最新更新