下面的代码(基于 - Using VBA in Excel to Google Search in IE and return the hyperlink of the first result,由@Santosh提供)似乎为几乎所有网址打印getelementsbytagname("a")
。事实证明它并不适合某些人,代码中给出了一个示例URL(weatherford.com)...除非我注释掉Zz行。有什么理由吗?
注意:要打印carmax的链接,请按原样运行代码。要打印weatherford的链接,请注释掉第1a和2a行,取消注释第1b和2b行。运行宏,它将打印一个空白.txt文档,用于weatherford链接。现在删除桌面上的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\~\desktop\carmaxLinks.txt" For Output As #1 '-->2a
'Open "C:\Users\~\desktop\weatherfordLinks.txt" For Output As #1 '-->2b
For Each lnk In html.getelementsbytagname("a")
Print #1, lnk
Next
Close #1
End Sub
答案 0 :(得分:0)
这不是一个答案,但更像是评论,因为我缺乏足够的评论声誉。
可以使用Fiddler分析问题,{{3}}提供请求和响应的详细信息。当文件作为Web请求的一部分上载时,服务器需要Content-Type标头来标识媒体类型。对于简单请求,不需要此标头。
如果将Content-Type标头指定为tex / xml,则weatherford服务器需要具有正确XML请求主体的SOAP请求。回复如下:
<?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
部分都应该得到结果。