Benutzer mit den meisten Antworten
Telefonnummer Rueckwaertssuche

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&action=58&page=78&context=11&id=1049000661558437088546&recuid=Q5NIXQVZXYLXWNXL5QR6K3MZTGIXRAT46SE5I46VBHC32AQ&niceid=M%C3%BCller-Beate-Weimar-Legefeld-Lerchenweg&buc=1049&verlNr=1049&kw=&ph=03643775947&ci=Weimar&recFrom=1&pagePos=1&lastFormName=search_inv&zvo_ok=0&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üß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(" ", "").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
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(" ") 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
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 DragovBitte 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.
-
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(" ") 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
-
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