Saya mencoba mengekstrak Data dari URL .. ada beberapa kontak dan nomor ponsel di Cipher .. terlihat seperti Icone ... Saya ingin mengekstrak nomor itu juga ada satu tautan whatsapp. saya pikir itu tersembunyi di skrip java .. Saya ingin tautan itu juga ...

Di sini adalah Gambar URL saya, saya menandai dengan Kotak MERAH data apa yang ingin saya ekstrak ... di Gambar masukkan deskripsi gambar di sini

-1
Lalit Patel 19 September 2019, 23:15

1 menjawab

Jawaban Terbaik

Peringatan:

Tolong dicatat:

  1. Terlalu banyak permintaan atau terlalu cepat akan mengakibatkan server menawarkan halaman acak kepada Anda.
  2. Saya tidak dapat menguji semua halaman secara realistis sehingga jarak tempuh Anda di halaman lain mungkin berbeda.
  3. Ada beberapa tempat yang akan mendapat manfaat dari penanganan kesalahan yang ditambahkan tetapi itu bisa menjadi bagian pengembangan.

tl;dr;

Berikut ini memperluas dan meningkatkan jawaban yang ditautkan, dan kode dalam pertanyaan Anda, untuk menangani banyak nomor yang ada.

Kode yang ditambahkan dimulai dengan GetDetails dan kemudian tumpukan panggilan yang dihasilkan. Ini menggunakan prinsip yang sama untuk menggabungkan kunci dan nilai untuk memetakan bagian nomor tel dari instruksi css.

Bagian dari ::before untuk kunci yang diperoleh dengan regex -(\w+):before (lihat persegi panjang yang disorot pada gambar di bawah - 14 kecocokan. Pemetaan kelas elemen sebenarnya berasal dari, misalnya, .icon-ji dan kami hanya perlu bagian ji untuk kunci kamus)

enter image description here

Bagian dari ::before untuk nilai yang diperoleh dengan regex 9d0(\d+) (lihat persegi panjang yang disorot pada gambar di bawah - 13 kecocokan)

enter image description here

Pengurangan -1 selanjutnya dari nilai untuk mendapatkan digit yang ditampilkan pada halaman. Kemudian pemetaan 13 kunci pertama ke dalam kamus diikuti dengan menyediakan 14 pasangan nilai kunci yang dikodekan keras untuk grup penangkapan kunci terakhir

decodeDict(keys(UBound(keys))) = "+"

Untuk menentukan berapa banyak nomor telepon yang benar-benar ada, kami mengekstrak html untuk kontak telepon:

htmlToSearch = html.querySelector(".telCntct").outerHTML

Dan kemudian gunakan regex untuk mencocokkan nilai multi-kelas pertama dari setiap rentang anak atau karakter ",". Ini agar kita tahu di mana kita perlu membagi string yang didekodekan untuk menghasilkan angka keluaran yang diperlukan.

enter image description here

Catatan, dalam hal ini ada 24 kecocokan di mana salah satunya akan menjadi "," di antara nomor kontak yang terlihat di halaman:

enter image description here

Kami menganggap "," adalah pembatas antara nomor tel dan number of tel numbers listed = count of "," + 1 itu.

Melihat kembali html untuk kontak tel kita dapat melihat bahwa "," berada di luar rentang anak sehingga tidak akan dikembalikan dari querySelector/querySelectorAll pada induk (dengan html induk ditempatkan di Dokumen HTML lain untuk memanfaatkan ini metode); selanjutnya, setiap upaya untuk menggunakan sintaks berikutnya mis. nextSibling tidak akan mempertahankan urutan keluaran yang diperlukan.

output telah kami dekode string siap untuk dipotong-potong mis.

enter image description here

25 karakter yang terdiri dari dua angka.

Nilai array groups memberi tahu kami di mana harus memisahkan string ini seperti yang kami ketahui setiap kali kami menemukan "," karakter berikutnya adalah awal dari nomor baru.

enter image description here

Jadi, kami mengulang larik grup dan menguji nilai di setiap posisi, menggunakan posisi setiap "," dalam grup untuk menentukan pengirisan string ke dalam larik keluaran nomor telepon:

Dim totalNumbers As Long, count As Long, results()

totalNumbers = UBound(Split(htmlToSearch, ","))
ReDim results(0 To totalNumbers)

For i = LBound(groups) To UBound(groups)
    If InStr(groups(i), ",") > 0 Then
        results(count) = Mid$(output, startPos, IIf(startPos = 1, i, i - startPos))
        startPos = i + 1
        count = count + 1
    End If
Next
results(totalNumbers) = Right$(output, Len(output) - startPos - 1)
GetNumbers = results

Keluaran:

enter image description here


VBA:

Option Explicit

Public Sub GetTelNumbers()
    Dim html As htmlDocument, url As String, re As Object, s As String

    Set re = CreateObject("vbscript.regexp")

    url = "https://www.justdial.com/chengalpattu/Oasis-Pharma-Near-Saraswathi-Children-School-Revathypuram-Urapakkam/9999PXX44-XX44-181123145524-X8G7_BZDET"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", url, False
        .send
        s = .responsetext
    End With

    Set re = CreateObject("vbscript.regexp")
    Set html = New htmlDocument
    html.body.innerHTML = s

    With ThisWorkbook.Worksheets("Sheet1").Range("A2")
        .Offset(0, 0) = url
        .Offset(0, 1) = html.querySelector(".fn").innerText
        .Offset(0, 2) = Split(Split(Trim$(Replace$(GetString(re, s, "title>(.*)<"), Chr$(34), vbNullString)), "- ")(1), "  -")
        .Offset(0, 3) = Trim$(Replace$(GetString(re, s, "streetAddress"":(.*"")"), Chr$(34), vbNullString))
        .Offset(0, 4) = Trim$(Replace$(GetString(re, s, "addressLocality"":(.*"")"), Chr$(34), vbNullString))
        .Offset(0, 5) = Trim$(Replace$(GetString(re, s, "postalCode"":(.*"")"), Chr$(34), vbNullString))
        .Offset(0, 6) = Trim$(Replace$(GetString(re, s, "addressRegion"":(.*"")"), Chr$(34), vbNullString))
        .Offset(0, 7) = Trim$(Replace$(GetString(re, s, "addressCountry"":(.*"")"), Chr$(34), vbNullString))

        Dim numbers()
        numbers = GetDetails(re, s)
        .Offset(0, 8).Resize(1, UBound(numbers) + 1) = numbers
    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

Public Function GetDetails(ByVal re As Object, ByVal responsetext As String) As Variant
    Dim decodeDict As Object, i As Long
    Dim html As MSHTML.htmlDocument, keys(), values()

    Set decodeDict = CreateObject("Scripting.Dictionary")
    Set html = New MSHTML.htmlDocument

    html.body.innerHTML = responsetext

    keys = GetMatches(re, responsetext, "-(\w+):before")

    If UBound(keys) = 0 Then Exit Function

    values = GetMatches(re, responsetext, "9d0(\d+)", True)

    For i = LBound(values) To UBound(values)
        decodeDict(keys(i)) = values(i)
    Next

    Dim itemsToDecode()

    decodeDict(keys(UBound(keys))) = "+"

    itemsToDecode = GetValuesToDecode(html)

    GetDetails = GetNumbers(re, html, itemsToDecode, decodeDict)
End Function

Public Function GetMatches(ByVal re As Object, ByVal inputString As String, ByVal sPattern As String, Optional ByVal numeric = False, Optional ByVal spanSearch = False) As Variant
    Dim matches As Object, iMatch As Object, s As String, arrMatches(), i As Long

    With re
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .pattern = sPattern

        If .Test(inputString) Then
            Set matches = .Execute(inputString)
            ReDim arrMatches(0 To matches.count - 1)
            For Each iMatch In matches
                If numeric Then
                    arrMatches(i) = iMatch.SubMatches.item(0) - 1
                Else
                    If spanSearch Then
                        arrMatches(i) = iMatch
                    Else
                        arrMatches(i) = iMatch.SubMatches.item(0)
                    End If
                End If
                i = i + 1
            Next iMatch
        Else
            ReDim arrMatches(0)
            arrMatches(0) = vbNullString
        End If
    End With
    GetMatches = arrMatches
End Function

Public Function GetValuesToDecode(ByVal html As MSHTML.htmlDocument) As Variant
    Dim i As Long, elements As Object, results(), class As String

    Set elements = html.querySelectorAll(".telCntct span[class*='icon']")

    ReDim results(elements.Length - 1)
    For i = 0 To elements.Length - 1
        class = elements.item(i).className
        results(i) = Right$(class, Len(class) - InStrRev(class, "-"))
    Next
    GetValuesToDecode = results
End Function

Public Function GetNumbers(ByVal re As Object, ByVal html As htmlDocument, ByVal itemsToDecode As Variant, ByVal decodeDict As Object) As Variant
    Dim output As String, i As Long

    For i = LBound(itemsToDecode) To UBound(itemsToDecode)
        output = output & decodeDict(itemsToDecode(i))
    Next

    Dim htmlToSearch As String, groups As Variant, startPos As Long, oldStartPos As Long

    htmlToSearch = html.querySelector(".telCntct").outerHTML

    groups = GetMatches(re, htmlToSearch, "mobilesv|,", False, True)

    startPos = 1

    Dim totalNumbers As Long, count As Long, results()

    totalNumbers = UBound(Split(htmlToSearch, ","))
    ReDim results(0 To totalNumbers)

    For i = LBound(groups) To UBound(groups)
        If InStr(groups(i), ",") > 0 Then
            results(count) = "'" & Mid$(output, startPos, IIf(startPos = 1, i, i - startPos)) 'to preserve any leading zeroes
            startPos = i + 1
            count = count + 1
        End If
    Next
    results(totalNumbers) = Right$(output, Len(output) - startPos - 1)
    GetNumbers = results
End Function
1
QHarr 23 September 2019, 04:26