Как вы обнаружили, HEAD
информация тега (где живет мета-материал) удаляется при использовании document.body.innerHTML = .responseText
с ранним связыванием MSHTML.HTMLDocument
. Что бы вы ожидали, учитывая то, что вы населяете (document.body
). Вот почему вы не можете выбрать информацию meta
. С вашим поздним ограничением HTMLFile
(где вы не можете использовать querySelector
) вы используете метод .write
, который записывает в ваш документ (HTMLFile
) и, таким образом, сохраняет информацию HEAD
.
Необходимо убедиться, что информация HEAD
заканчивается в тегах BODY
. Либо как часть тела ответа, либо как извлеченный HEAD
, объединенный с новыми тегами BODY
и записанный в HTMLDocument
, если вы хотите использовать раннее связывание.
Например, для ясности пишу HEAD
информация между BODY
только теги (без остатка существующего ответа)
Option Explicit
Public Sub MetaInfoEarlyBound()
Dim html As MSHTML.HTMLDocument, htmlHead As MSHTML.HTMLDocument, xhr As MSXML2.XMLHTTP60
Dim re As VBScript_RegExp_55.RegExp
Set htmlHead = New MSHTML.HTMLDocument
Set html = New MSHTML.HTMLDocument
Set xhr = New MSXML2.XMLHTTP60
Set re = New VBScript_RegExp_55.RegExp
re.Pattern = "<head>([\s\S]+)<\/head>"
With xhr
.Open "GET", "https://krmivo-psy.heureka.cz/brit-premium-by-nature-adult-l-15-kg/specifikace/#section", False
.send
htmlHead.body.innerHTML = Replace$(Replace$(re.Execute(.responseText)(0), "<head>", "<body>"), "</head>", "</body>")
html.body.innerHTML = .responseText
End With
Debug.Print htmlHead.querySelector("[name='gtm:product_price']").Value
Debug.Print html.querySelector("[itemprop=lowPrice]").innerText
End Sub
В качестве отступления, я добавляю два более коротких метода (чем текущий другой ответ), чтобы достичь вашей цели с поздним связыванием. Обратите внимание, я закомментировал один из них.
Public Sub MetaInfoLateBound()
Dim resp As String
With CreateObject("MSXML2.xmlHttp")
.Open "GET", "https://krmivo-psy.heureka.cz/brit-premium-by-nature-adult-l-15-kg/specifikace/#section", False
.send
resp = .responseText
End With
With CreateObject("HTMLFile")
.write resp
' Dim post As Object
'
' Set post = .getElementById("new-pd")
' Debug.Print post.PreviousSibling.PreviousSibling.getElementsByTagName("span")(0).innertext
'
Dim metas As Object, i As Long
Set metas = .getElementsByTagName("meta")
For i = 0 To metas.Length - 1
If metas.Item(i).Name = "gtm:product_price" Then
Debug.Print metas.Item(i).Value
Exit For
End If
Next
End With
End Sub