Autor Beitrag
Basti909851
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 28.03.11 12:11 
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 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:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Basti909851
Basti909851 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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?

ausblenden 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?

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


matcht leider auch nicht...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 28.03.11 15:42 
Das ist schon nicht schlecht. Ich habe gerade mal rumgespielt, und bei mir sieht es jetzt so aus:

ausblenden 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Basti909851
Basti909851 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 28.03.11 22:41 
Ah, okay. Hoffe habe alles so richtig gemacht. Danke nochmal! :)