Zbieranie danych z kodu źródłowego strony - problem

0

Mam problem ze zbieraniem danych z kodu źródłowego strony. Chcę uzyskać kilka liczb, które występują bezpośrednio po danym stringu. Wszystko działa tak jak należy tylko w przypadku pierwszej drużyny z tabeli, później zbierane są nie te liczby, o które mi chodzi. Wydaje mi się, że powinno to działać, no ale kompilatora nie przekonam :). Jeśli ma ktoś propozycję jak to naprawić lub proponuje inną metodę do zrobienia tego samego, będę wdzięczny.

Kodzik (wersja wstępnie robocza):

try
            {
                string url = "http://www.livesports.pl/tabela/WpBznQ9s/IihNoof0/";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader sr = new StreamReader(response.GetResponseStream());
                string code = sr.ReadToEnd();
                sr.Close();

                string name = ">" + textBox1.Text + "<";

                //code = code.Replace("\t", "");
                //code = code.Replace("\n", "");
                //code = code.Replace(" ", "");

                Regex reg1 = new Regex(">[0-9][0-9]<");
                Regex reg2 = new Regex(">[0-9][0-9]:");
                Regex reg3 = new Regex(":[0-9][0-9]<+");
                string[] tab = { "", "", "" };

                Boolean bl1 = false;
                Boolean bl2 = false;
                Boolean bl3 = false; 

                richTextBox1.Text = code;

                foreach (Match m in reg1.Matches(code))
                {
                    if (code.IndexOf(m.ToString()) > code.IndexOf(name) && bl1 == false)
                    {
                        tab[0] = m.ToString();
                        bl1 = true;
                    } 
                }

                foreach (Match m in reg2.Matches(code))
                {
                    if (code.IndexOf(m.ToString()) > code.IndexOf(name) && bl2 == false)
                    {
                        tab[1] = m.ToString();
                        bl2 = true;
                    } 
                }

                foreach (Match m in reg3.Matches(code))
                {
                    if (code.IndexOf(m.ToString()) > code.IndexOf(name) && bl3 == false)
                    {
                        tab[2] = m.ToString();
                        bl3 = true;
                    } 
                }

                for (int i = 0; i < 3; i++)
                {
                    tab[i] = tab[i].Replace(">", "");
                    tab[i] = tab[i].Replace("<", "");
                    tab[i] = tab[i].Replace(":", "");
                }

                label2.Text = "Rozegrane mecze : " + tab[0] + " " + code.IndexOf(tab[0].ToString());
                label3.Text = "Bramki strzelone: " + tab[1] + " " + code.IndexOf(tab[1].ToString());
                label4.Text = "Bramki stracone : " + tab[2] + " " + code.IndexOf(tab[2].ToString());
                label1.Text = code.IndexOf(name).ToString();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            } 
0

Nie rozumiem czemu używasz indexof. Patrząc tutaj http://msdn.microsoft.com/en-[...]regularexpressions.match.aspx jest to niepotrzebne. W Mach.Value powinieneś mieć to co zostało znalezione, a w Index jest pozycja na której zostało znalezione.
Poza tym przyjrzyj się temu: http://msdn.microsoft.com/en-[...]xpressions.regex.matches.aspx

Podaj przykładowe dane, oczekiwany rezultat i otrzymany rezultat.

0

Dzięki za odpowiedź, ale już sobie (jak mniemam) poradziłem. Próbowałem z IndexOf, bo podobne stringi występują w źródle kilka razy. Póki co docelowo potrzebowałem zebrać informację o liczbie meczów danej drużyny, strzelonych golach itp. Przykładowa tabela: http://www.livesports.pl/tabela/Ei1I2Y0q/xOR3gQta.

Fragmenty kodu:

                string code = getSource(url);

                string name = textBox1.Text;
                string name2 = textBox2.Text;

                string matchesPattern = name + "</span></td><td>(?<value>.+?)</td>.*";
                string scoredPattern = name + "</span></td><td>[0-9]{1,2}</td><td>[0-9]{1,2}</td><td>[0-9]{1,2}</td><td>[0-9]{1,2}</td><td class=\"col_goals\">(?<value>.+?):[0-9]{1,2}</td>.*";
                string lostPattern = name + "</span></td><td>[0-9]{1,2}</td><td>[0-9]{1,2}</td><td>[0-9]{1,2}</td><td>[0-9]{1,2}</td><td class=\"col_goals\">[0-9]{1,2}:(?<value>.+?)</td>.*";

                int matches = getMatch(matchesPattern, code);
                int scored = getMatch(scoredPattern, code);
                int lost = getMatch(lostPattern, code);

                string code1 = code.Remove(code.IndexOf(">" + name + "<"), name.Length);
                string code2 = code.Remove(code.IndexOf(">" + name2 + "<"), name2.Length);
                code2 = code2.Remove(code2.IndexOf(">" + name2 + "<"), name2.Length);

                int homeMatches = getMatch(matchesPattern, code1);
                int awayMatches = getMatch(matchesPattern2, code2);
                int homeScored = getMatch(scoredPattern, code1);
                int homeLost = getMatch(lostPattern, code1);
                int awayScored = getMatch(scoredPattern2, code2);
                int awayLost = getMatch(lostPattern2, code2);

public static int getMatch(string pattern, string text)
        {
            int m = 0;

            var value1 = from Match match in Regex.Matches(text, pattern, RegexOptions.Singleline)
                         select new
                         {
                             Matches = match.Groups["value"].Value
                         };

            foreach (var track in value1)
            {
                m = Convert.ToInt32(track.Matches);
            }
            return m;
        }

Żeby dostać pierwsze informacje (tj liczba meczów i bramek ogólnie) pobieram pierwsze wystąpienia wzorca. Następnie wycinam to wystąpienie z tekstu i ponownie zbieram resztę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0