Entwickler-Ecke

Basistechnologien - RegEx best. Teil einer Webseite auslesen


Basti909851 - Mo 28.03.11 12:11
Titel: RegEx best. Teil einer Webseite auslesen
Hallo alle zusammen,

ich bin über Google auf dieses Forum aufmerksam geworden. Ich bin absoluter Neuling, was C# angeht und hoffe, dass ich hier nette Helfer finde, die mir bei diesem speziellen Problem ein wenig unter die Arme greifen.

Folgendes möchte ich machen: Ich möchte von der Webseite http://www.lotto.de die aktuellen (also die von der letzten Ziehung) gezogenen Lottozahlen auslesen und in einem Integer Array speichern. Dazu habe ich mir überlegt, dass ich zuerst wie folgt den Quelltext der Seite auslese:


C#-Quelltext
1:
2:
WebClient wc = new WebClient();
            string strHTML = wc.DownloadString("http://www.lotto.de");


Dabei habe ich festgestellt, dass die aktuellen Lottozahlen immer im gleichen <div> Container - nämlich mit der ID hp649gwzLeft liegen. Dann dort im <div>-Container lottonumbers und da in den <span> -Tags. Das ist für mich als Anfänger nicht zu schaffen... Ich habe laienhaft versucht das mit (.*?) zu machen, klappt aber überhaupt nicht.. Wie genau ist das also mit C# und dem passenden RegEx zu lösen? Hat da jemand eine Idee?


Mit bestem Dank und freundlichen Grüßen,
Basti

Moderiert von user profile iconKha: Highlight- durch C#-Tags ersetzt


Christian S. - Mo 28.03.11 14:27

Hallo und :welcome:!

Mit (.*?) bekommst ja erstmal irgendwie alles ;-) Du musst schon noch gucken, dass die Information, was davor zu stehen hat, mit in dem Regex vorkommt. Ich probiere sowas gerne mit dem Regulator [http://sourceforge.net/projects/regulator/] aus.

Du musst im Prinzip Deinen Regex so aufbauen:
- Erst muss der Div mit der ID kommen
- Dann beliebige Zeichen dazwischen (nicht-greedy)
- Dann der Div mit class "lottonumbers"
- Dann sechs Span-Tags mit den Lottozahlen drin (es dürfen aber Whitepsaces vor jedem davon sein)

Außerdem musst Du drauf achten, ob Du Multiline oder Singleline bei den RegexOptions benutzen musst.

Grüße
Christian


Basti909851 - Mo 28.03.11 15:31

Also ich habe mich jetzt mal durch ein RegEx Tutorial gequält und bin nicht wirklich weitergekommen und hoffe daher sehr, dass Du etwas spezifischer werden könntest. Also der folgende RegEx matcht 0 mal...

Aber warum nicht?


C#-Quelltext
1:
2:
3:
4:
//Stringmatich
            string patternToMatch = @"(<div id=""hp649gwzLeft"">(.*?)</div>)";
            Match theMatch = Regex.Match(strHTML, patternToMatch);
            richTextBox2.Text = theMatch.Groups[1].Value;


Aber der müsste doch auf jeden Fall schon mal matchen, oder? Die RichTextbox bleibt leider leer, wo doch eigentlich genau das in dem <div> Tag drin stehen müsste?! Nicht-greedy habe ich ja durch das Fragezeichen abgedeckt. Frage ist nur, wie mache ich nun die Umbrüche?


C#-Quelltext
1:
string patternToMatch = @"(<div id=""hp649gwzLeft"">(.*?)</div>\s<div class=""lottonumbers"">\s<span>(.*?)</span></div>)";                    


matcht leider auch nicht...


Christian S. - Mo 28.03.11 15:42

Das ist schon nicht schlecht. Ich habe gerade mal rumgespielt, und bei mir sieht es jetzt so aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
            WebClient wc = new WebClient();
            textBox1.Text = wc.DownloadString(@"http://www.lotto.de");

            string regex = "<div id=\"hp649gwzLeft\">.*?<div class=\"lottonumbers\">(?:\\s+<span>([\\d]{1,2})</span>){6}";
            RegexOptions options = RegexOptions.Singleline | RegexOptions.IgnoreCase;

            Regex reg = new Regex(regex, options);

            var m = reg.Match(textBox1.Text);

            var numbers = m.Groups[1].Captures;
            foreach (var n in numbers)
                MessageBox.Show(n.ToString());


Beim Regex suche ich erst nach dem Div. Dann kommen irgendwelche Zeichen, dann der nächste Div. Anschließend sechs Mal Leerzeichen mit nachfolgendem Span-Tag. Das "?:" bewirkt, dass die Gruppe keine Nummer bekommt, weil ich die nicht brauche.


Basti909851 - Mo 28.03.11 16:18

WOOOOOW! Das funktioniert ja SUPER!!! Ich weiß gar nicht, wie ich Dir danken soll??!! VIELEN VIELEN VIELEN DANK!


Trashkid2000 - Mo 28.03.11 19:57

Du könntest Christian z.B. leicht durch einen Klick auf den "Danke"- Button danken.

Und ansonsten das Thema als erledigt abhaken, wenn es gelöst ist (oder sich erledigt hat).


Basti909851 - Mo 28.03.11 22:41

Ah, okay. Hoffe habe alles so richtig gemacht. Danke nochmal! :)