Код xmlHTTP не работает для всех URL
Приведенный ниже код (на основе - Использование VBA в Excel для поиска Google в IE и возврата гиперссылки первого результата, @Santosh), похоже, печатает getelementsbytagname("a")
почти для всех URL. Оказывается, для некоторых это не так, и пример 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
1 ответ
Это не совсем ответ, но больше похоже на комментарий, так как мне не хватает репутации, чтобы комментировать.
Проблема может быть проанализирована с помощью Fiddler, который предоставляет подробную информацию о запросах и ответах. Заголовок 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
часть кода должна получить результаты.