Я пытаюсь найти способ получить правильный и полный URL-адрес ссылки.
Иногда с помощью item.href я получаю полный URL-адрес, а иногда показывает только about:something, about:..something или about:../something.
В этом случае с моим текущим кодом я перебираю все ссылки в этом URL-адресе и хочу получить полный URL-адрес ссылки, связанной с текстом «ВПР». Ответ, который я получаю с моим текущим кодом:
about:excel_vlookup.php и если я захочу просто объединить base_url (https://www.w3schools.com/excel/index.php) с Replace("about:excel_vlookup.php","about:",""), я получу неправильный ответ
вот так https://www.w3schools.com/excel/index.phpexcel_vlookup.php вместо https://www.w3schools.com/excel/excel_vlookup.php, это правильный полный URL-адрес, когда я навожу указатель мыши на эту ссылку.
Может кто-нибудь знает, как это сделать?
Sub full_url()
Dim htmlDoc As New HTMLDocument
Dim links As Object
Dim i As Integer
With New ServerXMLHTTP60
.Open "Get", "https://www.w3schools.com/excel/index.php", False
.send
htmlDoc.body.innerHTML = .responseText
End With
Set links = htmlDoc.body.getElementsByTagName("a")
With links
For i = 0 To .Length - 1
If .Item(i).innerText Like "*VLOOKUP*" Then
Debug.Print .Item(i).href
End If
Next
End With
End Sub
ОБНОВЛЯТЬ Судя по коду @taller, это работает, когда href имеет вид «about:something». Все еще нужно внести некоторые изменения, если href является полным URL-адресом.
Sub full_url1()
Dim htmlDoc As New HTMLDocument
Dim links As Object
Dim i As Integer, sUrl As String, aTxt, iCnt As Long
Const PREFIX = "about:"
sUrl = "https://www.w3schools.com/excel/index.php"
aTxt = Split(sUrl, "/")
iCnt = UBound(aTxt)
With New ServerXMLHTTP60
.Open "Get", sUrl, False
.send
htmlDoc.body.innerHTML = .responseText
End With
Set links = htmlDoc.body.getElementsByTagName("a")
With links
For i = 0 To .Length - 1
If .Item(i).innerText Like "*Spaces*" Then
href = .Item(i).href
If InStr(1, href, "https://") = 1 Then
Debug.Print .Item(i).href
Else
aTxt(iCnt) = Mid(href, Len(PREFIX) + 1)
Debug.Print Join(aTxt, "/")
End If
Exit For
End If
Next
End With
End Sub






Документация Майкрософт:
Sub full_url()
Dim htmlDoc As New HTMLDocument
Dim links As Object
Dim i As Integer, sUrl As String, aTxt, iCnt As Long
Const PREFIX = "about:"
sUrl = "https://www.w3schools.com/excel/index.php"
aTxt = Split(sUrl, "/")
iCnt = UBound(aTxt)
With New ServerXMLHTTP60
.Open "Get", sUrl, False
.send
htmlDoc.body.innerHTML = .responseText
End With
Set links = htmlDoc.body.getElementsByTagName("a")
With links
For i = 0 To .length - 1
If .Item(i).innerText Like "*Spaces*" Then
href = .Item(i).href
If InStr(1, href, "https://") = 1 Then
Debug.Print .Item(i).href
ElseIf InStr(1, href, PREFIX) = 1 Then
aTxt(iCnt) = Mid(href, Len(PREFIX) + 1)
If Left(aTxt(iCnt), 1) = "/" Then aTxt(iCnt) = Mid(aTxt(iCnt), 2)
Debug.Print Join(aTxt, "/")
End If
Exit For
End If
Next
End With
End Sub
Спасибо. Ваш код теперь исправляет многие другие случаи, у меня только странная ссылка, думаю, она слишком длинная. Дело в sURL =https://www.example.com/somestring/xyz/abc.html и href about:../xyz/abc/some-other-string.html. Следуя вашей идее, я добавил еще одно условие If Left(aTxt(iCnt), 3) = "../" Then aTxt(iCnt) = Mid(aTxt(iCnt), 4), в результате чего этот URL https://www.example.com/somestring/xyz/xyz/abc/some-other-string.html, но xyz повторяется. В связи с этим я пытался найти способ, с помощью которого html-библиотека Microsoft выдает полный URL-адрес без этих исправлений, возможно, он не существует.
Привет @taller, спасибо за ответ. Он работает очень хорошо, когда href похож на «about:something». У меня возникают проблемы, если href представляет собой строку URL, начинающуюся с «http...». Если у вас есть возможность, пожалуйста, посмотрите мое обновление в исходном сообщении. Когда искомый текст — «Пробелы», базовый URL-адрес меняется, и в этом случае я получил неправильный ответ. Я внес некоторые изменения в ваш код, пытаясь обработать эти случаи, но все равно не удалось.