Daten von einer Internetseite "durchlesen"

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von striker1995.

    Daten von einer Internetseite "durchlesen"

    Hallo Leute,

    mich hat wieder nach längerer Pause das Programmiervirus gepackt. Ich habe durch einen dritten eine tolle Idee für ein Programm bekommen. Das Programm soll die Internetseite nach Länder durchsehen und danach eine Message bei speziellen Ländern anzeigen.

    Ich hab schon die GUI mehr oder weniger fertig. Doch nun komme ich ans eingemachte. Wie komme ich an die Daten der Website ran, respektive wie lese ich sie aus?

    Ich habe diesen Thread nun schon mehrmals durchgelesen, aber es macht einfach nicht dieses berühmt-berüchtigtes "Klick". Die Ressourceinternetseite ist diese. Mich interessiert eigentlich nur das in der mittlere Teil der Seite ab

    HTML-Quellcode

    1. <div class="preformatted">
    2. <pre>
    3. <br><A href="


    bis

    HTML-Quellcode

    1. <br>
    2. </p>
    3. <script type='text/javascript'>


    Der Text dazwischen ist variabel und ändert alle 3 min. Mich interessieren in dem Block nur die Länder. Beispiel, eine Zeile von heute als Demonstration:

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/XXX"class="qrz" target="_blank">XXX </A> 10109.1 <A href="http://www.qrz.com/db/XXX"class="qrz" target="_blank">XXX </A> cq cq 0030 04 Sep Nicaragua


    In diesem Fall liegt mein Interesse an Nicaragua. Deshalb hier meine Vorgehensweise:
    Ich wollte eine Listbox machen und dann den Block ab den Parametern dort einlesen. Danach wollte ich dann Zeile für Zeile durchlaufen lassen und nur den hinteren Teil durch ein Substring abtrennen. Danach mache ich dann einen Check ob ich das Land bereits habe. Falls ja, geht es einfach weiter mit der nächsten Zeile. Falls nicht, dann brauche ich das Callsign was in blau hinterlegt ist. Ausserdem auch noch das Band , in dem Fall die Rote Zahlenkombination (Grösse kann sich ändern). Dies könnte ich dann per SubString wieder rausfiltern.

    Nun meine Frage, da mir das alles dann doch recht schleierhaft wirkt ob diese Methode wirklich glücklich gewählt ist. Die Daten aus dem HTML Quelltext auslesen wie oben im Thread beschrieben fällt derzeit für mich aus, da ich nicht wirklich verstehe wie ich das machen soll (ist mir denke ich zu hoch) und da bei dieser Seite nicht mit solchen "ID's" gearbeitet wird. Gibt es noch ne bessere (nennt man das dann "elegantere") Variante? Oder hat einer vielleicht eine bessere Idee?

    vielen Dank schonmal hier für eure Ideen!

    EDIT: Das mit dem SubString geht irgendwie nicht da es zum Beispiel verschiedene Länder gibt die ein Leerzeichen in der Mitte haben. Beispiel European Russia, St Kitts, United States,....
    damit hat sich meine Idee dann in Luft aufgelöst... :cursing: :cursing:
    cheers Kevin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Springbok“ ()

    Hallo,

    hast du es schonmal mit Regular-Expressions versucht ?
    hier kannst du eine Expression definieren, die mehrere
    Rückgabewerte (in Klammern) enthält.

    <A href="http://www.qrz.com/db/XXX"class="qrz" target="_blank">XXX </A>

    Regular müsste(glaube ich) so aussehen:

    \<A href="http://www......"class"...." target"\>(.*?)\</A\>
    Hier der Wiki Link zu Regex: REGEX
    Ok vielen Dank Phreak87 für die Empfehlung von diesen Regular Expressions. Ich hab mich damit nun ein wenig mehr beschäftigt und habe die wirklich tolle Internetseite txt2re gefunden, die einem diese RegEx wirklich vereinfacht. Nun habe ich aber ein Problem, respektive ich find die Lösung zu meinem Fall nicht, egal was ich anstelle. Ein Callsign besteht normalerweise aus einer Reihe von Buchstaben, Zahlen und einem Schrägstrich "/". Die länge kann auch variieren. Beispiel für Callsigns:

    LOK2F
    KILO9HZD
    HKG/821
    JO0XXC1DE
    HU22X

    Ziemlich variabel also. Nun aber meine Frage.
    Beispiel 1: <a href="'http://www.txt2re.com/index-vb.php3?s=XXXXX 14127.0 YYYYYY/0 rda-????? RRA_??? 1102 05 Sep Asiatic Russia&33&38&32'" wcf_href="'http://www.txt2re.com/index-vb.php3?s=XXXXX 14127.0 YYYYYY/0 rda-????? RRA_??? 1102 05 Sep Asiatic Russia&33&38&32'">txt2re.com
    Das Callsign ist: XXXXX
    Bekomme ich wenn ich das in ein Programm einbaue auch so raus. Problem ist aber nun, wenn die Länge oder die Reihenfolge der Buchstaben/Zahlen sich ändert, dass dann irgendetwas rauskommt aber nicht mehr der Callsign.

    Der HTML-Code sieht so aus:

    HTML-Quellcode

    1. "<A href=""http://www.qrz.com/db/LX1SG""class=""qrz"" target=""_blank"">LX1SG </A> 14070.0 <A href=""http://www.qrz.com/db/LXXXX""class=""qrz"" target=""_blank"">LXXXX </A> PSK IOTA +EU-005 0935 05 Sep Wales"


    Mich interessiert dieser Teil (in rot markiert): ..."_blank"">LX1SG </A>...
    und dieser Teil (in rot markiert): ....Sep Wales"
    Die Punkte stehen immer für das was vorher/danach kommt.

    Geht das denn überhaupt, dass man eine Zeichenfolge die variabel ist und die Zahlen und/oder Buchstaben und/oder diesen Schrägstrich enthält rausfinden kann. Laut dem Tutorial hier scheint es ja möglich zu sein, aber ich kriegs einfach nicht gebacken. Ne Alternative wäre die Zeile zu splitten nach jedem Leerzeichen, aber das habe ich schon zur Genüge gemacht. Ich wollte etwas "professionelleres" mal machen und auch was dazulernen.
    cheers Kevin
    Hi,

    Regex kann sicher deinen Fall auch abdecken. Online-Generatoren für Regular-Expressions
    verwenden meist nicht alle Methoden, die Regex bietet. mit ".*? " bekommst du ein beliebiges
    Zeichen, dass beliebig oft vorkommen darf und danach ein Leerzeichen enthält.
    Du kannst das ganze auch auf längen, numerisch, alphanumerisch und maximale/minimale längen filtern
    und wie vielleicht in deinem Fall vorgesehen bestimmte Zeichenfolgen blockieren ...

    Mit deinen Beispielen kann ich gerade wenig anfangen. Kannst du mir 2 oder 3 komplette URL´s
    und dazu den Text dazu schicken, den du gerne haben möchtest ?
    Ich werd dann selbst mal an den Beispielen testen und dir die Regex schicken ..

    Phreak87 schrieb:

    Mit deinen Beispielen kann ich gerade wenig anfangen. Kannst du mir 2 oder 3 komplette URL´s
    und dazu den Text dazu schicken, den du gerne haben möchtest ?
    Ich werd dann selbst mal an den Beispielen testen und dir die Regex schicken ..
    Erst einmal vielen Dank für deine Hilfe. Hier habe ich dir 5 solcher Beispiele gepostet:

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/9A1CVW"class="qrz" target="_blank">9A1CVW </A> 14215.0 <A href="http://www.qrz.com/db/9A206Z"class="qrz" target="_blank">9A206Z </A> cq Ivan qsl via bureau 1535 05 Sep Croatia

    Resultat: 9A1CVW @ Croatia

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/PA3WB"class="qrz" target="_blank">PA3WB </A> 14275.0 <A href="http://www.qrz.com/db/8Q7OE"class="qrz" target="_blank">8Q7OE </A> tnx 1535 05 Sep Maldives

    Resultat: PA3WB @ Maldives

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/KF7IQ"class="qrz" target="_blank">KF7IQ </A> 14183.0 <A href="http://www.qrz.com/db/C21BN"class="qrz" target="_blank">C21BN </A> 1535 05 Sep Nauru

    Resultat: KF7IQ @ Nauru

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/JA0DIN"class="qrz" target="_blank">JA0DIN </A> 14082.0 <A href="http://www.qrz.com/db/C31KC"class="qrz" target="_blank">C31KC </A> tnx qso 1534 05 Sep Andorra

    Resultat: JA0DIN @ Andorra

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/EA5AER"class="qrz" target="_blank">EA5AER </A> 14027.0 <A href="http://www.qrz.com/db/SV0XCC"class="qrz" target="_blank">SV0XCC/9 </A> IOTA EU-015 1533 05 Sep Crete

    Resultat: EA5AER @ Crete

    Dabei ist aber etwas wichtig. Ich muss die Zeichenfolge hinet <A href="http://www.qrz.com/db/EA5AER"class="qrz" target="_blank"> nehmen, da ich sonst nicht immer den richtien Callsign habe, weil viele Radioamateure auf Expeditionen sind und da dann ihr aktuelles Zeichen steht. Es wäre auch toll, wenn du mir das nachher ein wenig erklären könntest, da ich ja was lernen will. Achja, bevor ich es vergesse: Es reicht mir schon wenn ich einfach nur das Callsign habe. Ich möchte dann nachher selbst probieren den Teil "@ Land/Region" herauszufiltern. (Lass den Teil vom Code einfach weg. Wenn ich ihn nicht hin bekomme würde ich dich dann darum bitten. Ich hoffe du bist nicht böse deswegen, aber ich möchte auch was (dazu)-lernen. :) )

    jvbsl schrieb:

    Falsch, RegEx ist nicht gleich RegEx...
    Was meinst du damit bitte? Lieber doch nicht RegEx verwenden?


    Dabei hab ich nun noch ne Frage:
    Ich habe die ganze HTML der Seite in eine RichTextBox zwischengespeichert, da ich nicht weiss ob man das ohne zwischenspeichern hinbekommt. Nun wollte ich alle unnötigen Einträge in der RichTextBox loswerden, respektive löschen, aber ich schaff das einfach. Hier mal mein Code:

    VB.NET-Quellcode

    1. Public Sub RTBHMTL_Cleanup()
    2. Dim I As Integer = 0
    3. Dim Line As String = ""
    4. Dim LineRead() As String = RTBHTML.Lines
    5. For I = 0 To 345 ' 345 weil das immer die Anzahl der Zeilen ist
    6. Line = LineRead(I)
    7. If Line.Contains("<A href=""http://www.qrz.com/db/") Then
    8. Else
    9. LineRead(I) = ""
    10. End If
    11. Next
    12. RTBHTML.Lines = LineRead
    13. End Sub


    Die HTML Datei sieht genauso aus, als die die ich von der Website geladen habe. Brauch ich das überhaupt oder soll ich das komplett weglassen?
    vielen Dank schonmal für jede Hilfe
    cheers Kevin
    Was meinst du damit bitte? Lieber doch nicht RegEx verwenden?

    Ich habe doch extra meinen Vorredner zitiert, der meinte, dass die Online-RegEx Editoren RegEx nicht komplett implementiert haben, das ist aber nicht ganz richtig, denn die verwenden schon vollständiges RegEx, aber nicht das RegEx, was Microsoft verwendet. Das meiste kann man zwar 1 zu 1 übernehmen, aber manche Dinge sind leicht anders, oder gibt es beim jeweils anderen RegEx nicht.

    Dies ist aber kein Grund RegEx zu entsagen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich glaub ich hab das erste RegEx. Der "Filter" mit dem ich suchen muss ist ja, um in dieser Zeichenfolge

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/KF7IQ"class="qrz" target="_blank">KF7IQ </A> 14183.0 <A href="http://www.qrz.com/db/C21BN"class="qrz" target="_blank">C21BN </A> 1535 05 Sep Nauru

    "KF7IQ" rauszubekommen ">.*? ", da ich ja das zweite KF7IQ brauche, was hinter <A href="http://www.qrz.com/db/KF7IQ"class="qrz" target="_blank"> steht. Ist das wirklich richtig?
    cheers Kevin
    Sorry wegen Doppelpost aber bearbeiten bringt mich nicht weiter...

    Hier mal das was ich im HTML Format habe:

    HTML-Quellcode

    1. <A href=""http://www.qrz.com/db/12345""class=""qrz"" target=""_blank"">12345 </A> 14127.0 <A href=""http://www.qrz.com/db/YYYYYY""class=""qrz"" target=""_blank"">YYYYYY/0 </A> rda-????? RRA_??? 1102 05 Sep Asiatic Russia


    Und dann hier der Code um das Callsign rauszubekommen:

    VB.NET-Quellcode

    1. Dim REX As New Regex("<A href=""(.*)""class=""qrz"" target=""_blank"">(?<Callsign1>([a-zA-Z0-9./]))? (.*)", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    2. Dim rxMatches As MatchCollection = REX.Matches("<A href=""http://www.qrz.com/db/12345""class=""qrz"" target=""_blank"">12345 </A> 14127.0 <A href=""http://www.qrz.com/db/YYYYYY""class=""qrz"" target=""_blank"">YYYYYY/0 </A> rda-????? RRA_??? 1102 05 Sep Asiatic Russia")
    3. For Each oMatch As Match In rxMatches
    4. lbCountries.Items.Add(oMatch.Groups("Callsign1").ToString())
    5. Next


    Jedoch wird kein Callsign in die Listbox hinzugefügt und ich Depp find den Fehler nicht :cursing: :cursing: :cursing: :cursing: . Man merkt doch schon, dass die letzten Programme lange her sind...
    cheers Kevin
    ... Hab mich ein wenig gespielt ...

    Versuch mal den da:

    <A href="http://www.qrz.com/db/.{4,7}"class="qrz" target="_blank">(.*?)</A>.*?<A href="http://www.qrz.com/db/.{4,6}"class="qrz" target="_blank">.*</A>.*Sep(.*)

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. ' <A href="http://www.qrz.com/db/9A1CVW"class="qrz" target="_blank">
    3. ' <A href="http://www.qrz.com/db/JA0DIN"class="qrz" target="_blank">
    4. ' <A href="http://www.qrz.com/db/KF7IQ"class="qrz" target="_blank">
    5. Dim STR_PAT_A As String = "<A href=""http://www.qrz.com/db/.{4,7}""class=""qrz"" target=""_blank"">"
    6. ' 9A1CVW </A> 14215.0 <A href="http://www.qrz.com/db/9A206Z"class="qrz" target="_blank">
    7. ' JA0DIN </A> 14082.0 <A href="http://www.qrz.com/db/C31KC"class="qrz" target="_blank">
    8. ' KF7IQ </A> 14183.0 <A href="http://www.qrz.com/db/C21BN"class="qrz" target="_blank">
    9. Dim STR_PAT_B As String = "(.*?)</A>.*?<A href=""http://www.qrz.com/db/.{4,6}""class=""qrz"" target=""_blank"">"
    10. ' 9A206Z </A> cq Ivan qsl via bureau 1535 05 Sep Croatia
    11. ' C31KC </A> tnx qso 1534 05 Sep Andorra
    12. ' C21BN </A> 1535 05 Sep Nauru
    13. Dim STR_PAT_C As String = ".*</A>.*Sep(.*)"
    14. TextBox1.Text = STR_pat_A & STR_PAT_B & STR_PAT_C
    15. For Each Eintrag As ListViewItem In ListView1.Items
    16. Dim RGX As System.Text.RegularExpressions.Match = System.Text.RegularExpressions.Regex.Match(Eintrag.Text, STR_pat_A & STR_PAT_B & STR_PAT_C)
    17. MsgBox(RGX.Groups(1).Value)
    18. MsgBox(RGX.Groups(2).Value)
    19. Next
    20. End Sub
    Hey phreak87, erst einmal ein dickes und grosses Dankeschön. Ich hab nun hier nicht reingeschaut die Tage, da ich keinen Internetanschluss bisher habe. Nun nur über so einen Surfstick, aber es reicht immerhin.

    Die Tage habe ich nun hier alles probiert. In Büchern der Bibliothek geschaut (da stand nicht viel brauchbares drin) und auch selbst probiert, aber es hat nichts geholfen. Ich raff das Ding einfach nicht. Dabei kann es doch nicht so schwer sein. Auf jeden Fall funktioniert deine Version 1a. Gerade ausprobiert und es läuft einwandfrei. Ich hab nun das Programm auch etwas schneller gemacht, damit die RegEx nicht immer alles durchsuchen müssen sondern nur die wichtigsten Zeilen.

    Aber ich hab noch ne Frage, obwohl ich mir die Antwort schon denken kann (steht untendrunter, wäre nett wenn mir jemand sagen könnte ob das stimmt), es aber nicht weiss weshalb ich lieber mal nachfrage:

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/YL2SW "class="qrz" target="_blank">YL2SW-@ </A> 10124.0 <A href="http://www.qrz.com/db/YL44WFF"class="qrz" target="_blank">YL44WFF </A> YLFF-043 KLINTAINE 1806 08 Sep Latvia


    Als Resultat bekomme ich hier "@". Ist das weil im Teil wo uns interessiert ein "-@" dabei ist und da wir das nicht in unser RegEx aufgenommen haben nicht geht? Dann versteh ich aber nicht wieso Latvia nicht angezeigt wird? Oder ist das weil wir das erste nicht finden?

    Komischerweise, was meine Theorie daher verneinen würde ist dieser Fall hier:

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/DJ1IJ "class="qrz" target="_blank">DJ1IJ-@ </A> 10144.5 <A href="http://www.qrz.com/db/LY1GN"class="qrz" target="_blank">LY1GN </A> rtty 1806 08 Sep Lithuania


    Da bekomme ich als Resultat allerdings dann "DJ1IJ-@ @ Lithuania".

    Aber hier dann:

    HTML-Quellcode

    1. <A href="http://www.qrz.com/db/DM2RN"class="qrz" target="_blank">DM2RN </A> 10124.0 <A href="http://www.qrz.com/db/YL44WFF"class="qrz" target="_blank">YL44WFF </A> 1758 08 Sep Latvia


    bekomme ich als Resultat "@".
    Nun schlussfolgere ich also: Sobald der RegEx String dann etwas von dem "Standardweg" abkommt, geht es nicht? Das heisst man keine Möglichkeit etwaige Anomalien (wenn wir es so nennen können) "auszubügeln"?

    Anbei noch ne Frage, da ich eine Idee brauche wie ich das gut machen kann:
    Bisher wird bei jedem "neuen" Land eine Msgbox aufgerufen in der dann das Callsign und das Land steht. Gibt es da denn nicht eine professionellere Methode dies anzuzeigen. Ich steh da echt auf dem Schlauch...

    Vielen vielen Dank nochmal an Phreak87 für deine Hilfe!
    cheers Kevin
    servus !

    Springbok schrieb:

    Als Resultat bekomme ich hier "@". Ist das weil im Teil wo uns interessiert ein "-@" dabei ist und da wir das nicht in unser RegEx aufgenommen haben nicht geht? Dann versteh ich aber nicht wieso Latvia nicht angezeigt wird? Oder ist das weil wir das erste nicht finden?
    Kann ich nicht bestätigen ... In meinem Test bekomme ich gar kein Ergebnis ... liegt daran weil mir nicht der gesamt Quelltext zur verfügung steht sondern nur der Ausschnitt.
    Fehler kommt daher weil im Regex ein .{4,6} steht ..
    . = beliebiges Zeichen {4,6} = Länge der Zeichenkette min 4, max 6 Zeichen .. sind aber 7 ;) Deshalb sucht der im Quelltext dann
    weiter wos passt und liefert dann das falsche Ergebnis ...
    Zu Regex kann ich selbst nur sagen ... alles Wissenswerte steht in Wikipedia ... da hab ich meine Infos her und auch deinen Regex String gebastelt.

    Springbok schrieb:

    Da bekomme ich als Resultat allerdings dann "DJ1IJ-@ @ Lithuania".
    Bekomme hier als Ergebnis DJ1IJ-@ Lithuania ... So wie es sein soll ...

    Springbok schrieb:

    bekomme ich als Resultat "@".
    Nun schlussfolgere ich also: Sobald der RegEx String dann etwas von dem "Standardweg" abkommt, geht es nicht? Das heisst man keine Möglichkeit etwaige Anomalien (wenn wir es so nennen können) "auszubügeln"?
    Also mit der .{4,7} bekomme ich hier auch das richtige Ergebnis ... Regex sucht im gesamten Quelltext "wahrlos" weiter
    und bringt dir somit irgendwoher* das @ Zeichen... du kannst auch "Ausschlüsse" definieren wenn du den Fehler "lokalisiert" hast ...
    dann würde er gar kein Ergebnis bringen wenn nicht zutreffend ... Mein Regex ist noch eher "grob" gehalten und lässt Anomlien zu.
    das .*? lässt beliebige Zeichen in beliebiger länge zu ..

    Springbok schrieb:

    Anbei noch ne Frage, da ich eine Idee brauche wie ich das gut machen kann:
    Bisher wird bei jedem "neuen" Land eine Msgbox aufgerufen in der dann das Callsign und das Land steht. Gibt es da denn nicht eine professionellere Methode dies anzuzeigen. Ich steh da echt auf dem Schlauch...
    Mach ne Listview :D

    Listview.items.add (RGX.Groups(1).Value) ...

    Phreak87 schrieb:

    Mach ne Listview :D
    mhh, naja wollt nicht einfach nur ne Liste machen sondern wirklich so etwas wie ein Popup, damit der User dann sieht falls was neues eingetroffen ist, andernfalls muss er das Programm ja dann immer im Vordergrund haben. Ich dachte eher an ein Popup à la Microsoft. Ich meine die Popups die von der Taskbar aus unten rechts auftauchen, wie zum Beispiel mit dem Message "Kein Anti-Virus aktiv" etc.. Aber erst einmal: Wie heisst das richtig?
    cheers Kevin

    Yissu schrieb:

    NotifyIcon heißt das Toolbar Element dafür

    Ok danke für den Tipp, aber nach probieren stellt mich das NotifyIcon nicht wirklich zufrieden... Da muss was "besseres" her...

    Anbei noch ne Frage: American Samoa wird ja als AmericanSamoa angezeigt (als ohne ein Space). Das kann man aber nicht einfach so noch nachher einfügen oder? (Wenn es nicht mit den Regular Expressions sofort ginge, dann würde ich eine String suche nach jedem grossen Buchstaben machen und dann einfach ein Space vorher einfügen.)

    Vielen Dank nochmal für eure Hilfe!
    cheers Kevin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Springbok“ ()

    Du kannst ja auch eine eigene Form für deine Meldungen machen,
    mit der hast dann volle Kontrolle wie es aussieht und was passiert.

    Oder du suchst dir im Internet Controls raus, die das genauso wie
    die Windows Notifications machen ... Den Merlin damals vom Word
    müsste es auch noch geben falls du den noch kennst ... der macht
    auch schöne Benachrichtigungen ...