Вы можете использовать селектор класса css
Option Explicit
Public Sub GetInfo()
Dim html As HTMLDocument
Set html = New HTMLDocument '< VBE > Tools > References > Microsoft Scripting Runtime
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.justdial.com/Agartala/Abhay-Varieties-Nor-Banamalipu/9999PX381-X381-141028162716-U1Z5_BZDET", False
.send
html.body.innerHTML = .responseText
End With
Debug.Print html.querySelector(".ph_hdr").innerText
End Sub
. Если вы хотите разделить строки, используйте
Dim items() As String, i As Long
items = Split(html.querySelector(".ph_hdr").innerText, ", ")
For i = LBound(items) To UBound(items)
If items(i) <> vbNullString Then
Activesheet.Cells(i + 1, 1) = items(i)
End If
Next
. Странная ситуация в том, что обычно я бы взял все сценарии помечаются с помощью json с помощью css-селектора script\[type='application/ld+json'\]
и цикла, который ищет информацию 1 . Однако, несмотря на наличие информации, когда я просматриваю текстовый файл, в момент, когда я использую DOM-парсер, я не могу найти эту информацию. Итак, как бы мне не хотелось защищать регулярные выражения с помощью html, вот решение для регулярных выражений:
Option Explicit
Public Sub GetInfo()
Dim html As HTMLDocument, s As String, re As Object
Set re = CreateObject("vbscript.regexp")
Set html = New HTMLDocument '< VBE > Tools > References > Microsoft Scripting Runtime
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.justdial.com/Agartala/Abhay-Varieties-Nor-Banamalipu/9999PX381-X381-141028162716-U1Z5_BZDET", False
.send
s = .responseText
html.body.innerHTML = s
Debug.Print html.querySelector(".fn").innerText
Debug.Print Trim$(Replace$(GetString(re, s, "title>(.*)<"), Chr$(34), vbNullString))
Debug.Print Trim$(Replace$(GetString(re, s, "streetAddress"":(.*"")"), Chr$(34), vbNullString))
Debug.Print Trim$(Replace$(GetString(re, s, "addressLocality"":(.*"")"), Chr$(34), vbNullString))
Debug.Print Trim$(Replace$(GetString(re, s, "postalCode"":(.*"")"), Chr$(34), vbNullString))
Debug.Print Trim$(Replace$(GetString(re, s, "addressRegion"":(.*"")"), Chr$(34), vbNullString))
Debug.Print Trim$(Replace$(GetString(re, s, "addressCountry"":(.*"")"), Chr$(34), vbNullString))
End With
End Sub
Public Function GetString(ByVal re As Object, ByVal inputString As String, ByVal pattern As String) As Variant
Dim matches As Object
With re
.Global = True
.MultiLine = True
.IgnoreCase = True
.pattern = pattern
If .test(inputString) Then
Set matches = .Execute(inputString)
GetString = matches(0).SubMatches(0)
Exit Function
End If
End With
GetString = "No match"
End Function
"address":
Передача по каналу является корректным способом сгладить вложенные структуры, таким образом, я не уверен, что было бы более "изящным". Да, синтаксис является немного шумным строкой взглядом, но откровенно довольно пригодный к эксплуатации.
Тот же код, просто перенесенный в функцию:
function Flatten($a)
{
,@($a | % {$_})
}
Тестирование:
function AssertLength($expectedLength, $arr)
{
if($ExpectedLength -eq $arr.length)
{
Write-Host "OK"
}
else
{
Write-Host "FAILURE"
}
}
# Tests
AssertLength 0 (Flatten @())
AssertLength 1 (Flatten 1)
AssertLength 1 (Flatten @(1))
AssertLength 2 (Flatten @(1, 2))
AssertLength 2 (Flatten @(1, @(2)))
AssertLength 3 (Flatten @(1, @(2, @(3))))