none
Telefonnummer Rueckwaertssuche RRS feed

  • Frage

  • Hallo,

    auf der Webseite dasoertliche.de kann man einen Teilnehmer anhand einer Telfonnummer suchen lassen (Rückwärtssuche). Im HTML der Seite kann man die Werte auslesen (alles legal !). Leider implementieren die Macher in letzter Zeit zunehmend Werbung. Mein Code funktioniert nicht mehr. Statt dem Namen des Teilnehmers bekomme ich den Werbungstext zurück. Ich bin nicht in der Lage, meinen Code anzupassen. Kann mir jemand behilflich sein? Danke!

    Hier der HTML Code der Webseite:

    <div class="headline02 filter" ><div class="headline02">A - Z Trefferliste</div></div>
    			<div class="hit clearfix  st-treffer" 
    				 id="entry_1">
    				<div class="left oe_hit" style=">
    			<div class="counter">1</div>
    			<h2>
    				<a href="https://www.dasoertliche.de/?form_name=detail&amp;action=58&amp;page=78&amp;context=11&amp;id=1049000661558437088546&amp;recuid=Q5NIXQVZXYLXWNXL5QR6K3MZTGIXRAT46SE5I46VBHC32AQ&amp;niceid=M%C3%BCller-Beate-Weimar-Legefeld-Lerchenweg&amp;buc=1049&amp;verlNr=1049&amp;kw=&amp;ph=03643775947&amp;ci=Weimar&amp;recFrom=1&amp;pagePos=1&amp;lastFormName=search_inv&amp;zvo_ok=0&amp;hitno=0" class="preview name st-treff-link"
    					target="_self"
    				><span class="st-treff-name">Müller Beate</span></a>
    			</h2>
    			<address>
    						Lerchenweg 16, 99428 <span class="st-treffer-ort"> Weimar, Legefeld</span>
    			</address>
    			
    			<a href="#" class="hitlnk_flower" rel="nofollow">Blumengr&uuml;&szlig;e versenden mit Euroflorist</a>

    Zum Parsen verwende ich folgenden VB Code:

    Imports System.Net
    Imports System.Text
    Imports HtmlAgilityPack
    
    Public Class DasOertliche
        Private Tab As Char = Convert.ToChar(9)
        Private CrLf As String = Environment.NewLine
        Friend Property AnruferListe As List(Of String)
    
        Friend Function Anrufer(caller As String) As Boolean
            Dim liste = New List(Of String)
            Dim client As WebClient = New WebClient()
            Dim doc As HtmlDocument = New HtmlDocument()
    
            doc.Load(client.OpenRead("https://www.dasoertliche.de/?form_name=search_inv&buc=674&page=5&context=4&action=43&ph=" & caller), Encoding.UTF8)
            Dim i As Integer = 1
    
            Try
                While i < 10
                    Dim entry = doc.GetElementbyId($"entry_{i}")
                    If entry Is Nothing Then Exit While
    
                    Dim divLeftOnHit = entry.ChildNodes.FirstOrDefault(Function(a) a.HasClass("oe_hit"))
                    Dim _Name As String = HttpUtility.HtmlDecode(divLeftOnHit.ChildNodes.FirstOrDefault(Function(a) a.Name = "a").InnerText.Replace(CrLf, ""))
                    Dim _Adresse As String = divLeftOnHit.ChildNodes.FirstOrDefault(Function(a) a.Name = "address").InnerText.Replace(CrLf, "").Replace(Tab, "")
                    liste.Add(_Name & ";" & _Adresse.Replace("&nbsp", "").Replace(",", " "))
                    i += 1
                End While
            Catch ex As Exception
                Dim dummy As String = ""
            End Try
    
            AnruferListe = liste
            Return liste.Count > 0
        End Function
    End Class
    _Adresse kommt richtig, als Name kommt aber die Werbung. Manchmal aber auch die Mailadresse. Wie kann ich den Namen richtig auslesen? Wenn ihr weitere Beispiele braucht, ruft einfach mal die Webseite dasoertliche.de auf und gebt bei der Rückwärtssuche eure eigene Telefonnummer (oder die eines Bekannten) ein. Im HTML-Doc sind die Angaben zu finden.

    Vielen Dank und herzliche Grüße

    Norbert


    • Bearbeitet norbert3 Sonntag, 21. Februar 2021 14:39
    Sonntag, 21. Februar 2021 14:38

Antworten

  • Hallo Norbert,

    ich habe mal sowas in der Art gemacht. Hab das wesentliche in eine VB.NET Konsolenanwendung geschrieben:

    Imports System.IO
    Imports System.Text.RegularExpressions
    Imports HtmlAgilityPack
    Imports System.Linq
    Module Module1
    
        Sub Main()
    
            Dim url As String = "https://www.dasoertliche.de/?form_name=search_inv&buc=674&page=5&context=4&action=43&ph=057028220"
            WebScrap(url)
    
        End Sub
    
        Public Sub WebScrap(ByVal url As String)
            Try
                'Get the content of the URL from the Web
                Dim web = New HtmlWeb()
                Dim doc = web.Load(url)
    
                'Filter the content
                Enumerable.ToList(Enumerable.Where(doc.DocumentNode.Descendants(), Function(n) Equals(n.Name, "script"))).ForEach(Sub(n) n.Remove())
                Dim nodes = If(doc.DocumentNode.SelectNodes($"//*[@class='left oe_hit']"), Enumerable.Empty(Of HtmlNode)())
    
                'Write the desired content to a file
                Using file = New StreamWriter("test.txt")
    
                    For Each node In nodes
                        'Get the country name
                        Dim splittedWords = Regex.Split(node.InnerText, Microsoft.VisualBasic.Constants.vbLf)
                        Dim words = splittedWords.Where(Function(x) Not x.Contains("&nbsp;") AndAlso Not String.IsNullOrEmpty(x.Trim())).ToList()
                        If words.Count() < 1 Then Continue For
                        Dim name = words(1).Trim()
                        Dim addr = words(2).Trim()
                        Dim mail = words(3).Trim()
                        Dim weba = words(4).Trim()
                        Dim result = $"{name}; {addr}; {mail}; {weba}"
                        file.WriteLine(result)
                        Console.WriteLine(result)
                    Next
                End Using
    
                Console.WriteLine(Microsoft.VisualBasic.Constants.vbCrLf & "Please press a key...")
                Console.ReadKey()
            Catch ex As Exception
                Console.WriteLine($"An error occured:
    {ex.Message}")
            End Try
        End Sub
    
    
    End Module

    Da sind allerdings keinerlei Abfragen drin, ob wirklich sämtliche Daten (Adresse, Mail, ...) vorhanden sind. Aber vielleicht ist das ja dennoch hilfreich.

    Gruß

    Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    • Als Antwort markiert norbert3 Montag, 22. Februar 2021 18:31
    Montag, 22. Februar 2021 14:56

Alle Antworten

  • Hallo norbert3,

    Bist Du sicher, dass Du die richtige Klasse in Deinem VB-Code abfragst? Im HTML-Code lautet die Klasse "left oe_hit" und im vb-Code suchst Du nach der Klasse "oe_hit". Hier findest Du einige nützliche Informationen zur Verwendung des Schlüssels (key) für ein "a"-Tag und zum Abrufen des Texts mit der InnerText-Eigenschaft.
    Parsing HTML TV Listings

    Gruß,

    Ivan Dragov

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 22. Februar 2021 11:49
    Administrator
  • Hallo Norbert,

    ich habe mal sowas in der Art gemacht. Hab das wesentliche in eine VB.NET Konsolenanwendung geschrieben:

    Imports System.IO
    Imports System.Text.RegularExpressions
    Imports HtmlAgilityPack
    Imports System.Linq
    Module Module1
    
        Sub Main()
    
            Dim url As String = "https://www.dasoertliche.de/?form_name=search_inv&buc=674&page=5&context=4&action=43&ph=057028220"
            WebScrap(url)
    
        End Sub
    
        Public Sub WebScrap(ByVal url As String)
            Try
                'Get the content of the URL from the Web
                Dim web = New HtmlWeb()
                Dim doc = web.Load(url)
    
                'Filter the content
                Enumerable.ToList(Enumerable.Where(doc.DocumentNode.Descendants(), Function(n) Equals(n.Name, "script"))).ForEach(Sub(n) n.Remove())
                Dim nodes = If(doc.DocumentNode.SelectNodes($"//*[@class='left oe_hit']"), Enumerable.Empty(Of HtmlNode)())
    
                'Write the desired content to a file
                Using file = New StreamWriter("test.txt")
    
                    For Each node In nodes
                        'Get the country name
                        Dim splittedWords = Regex.Split(node.InnerText, Microsoft.VisualBasic.Constants.vbLf)
                        Dim words = splittedWords.Where(Function(x) Not x.Contains("&nbsp;") AndAlso Not String.IsNullOrEmpty(x.Trim())).ToList()
                        If words.Count() < 1 Then Continue For
                        Dim name = words(1).Trim()
                        Dim addr = words(2).Trim()
                        Dim mail = words(3).Trim()
                        Dim weba = words(4).Trim()
                        Dim result = $"{name}; {addr}; {mail}; {weba}"
                        file.WriteLine(result)
                        Console.WriteLine(result)
                    Next
                End Using
    
                Console.WriteLine(Microsoft.VisualBasic.Constants.vbCrLf & "Please press a key...")
                Console.ReadKey()
            Catch ex As Exception
                Console.WriteLine($"An error occured:
    {ex.Message}")
            End Try
        End Sub
    
    
    End Module

    Da sind allerdings keinerlei Abfragen drin, ob wirklich sämtliche Daten (Adresse, Mail, ...) vorhanden sind. Aber vielleicht ist das ja dennoch hilfreich.

    Gruß

    Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    • Als Antwort markiert norbert3 Montag, 22. Februar 2021 18:31
    Montag, 22. Februar 2021 14:56
  • Es ist immer wieder verblüffend, was ihr da an "Zauberei" zu bieten habt! Da könnte man glatt in Depressionen verfallen, weil man merkt, dass man so etwas wohl niemals lernen wird. Der Filter ist der Hammer! Der Code läuft auf Anhieb perfekt durch. Und endlich bekommen wir auch vernünftige Daten zurück. Mein Personal wird morgen aus dem Staunen nicht mehr rauskommen ...

    Vielen Dank und ganz herzliche Grüße

    Norbert

    Montag, 22. Februar 2021 18:38