Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
celý prohlížeč mi dokonale jede - jsem krůček od vydání alfaverze. Jen se mi neadří získat text mezi párovými tagy.

public Page ParsePage (string pageHTML)
{
        Page parsed = new Page()
        {
                Forms = new List<Tag>(),
                Links = new List<Tag>(),
                Text = ""
        };

        List<Match> openTags = new List<Match>() { Regex.Match("" ,"") };

        List<Tag> closedTags = new List<Tag>() { new Tag() };

        foreach (Match m in Regex.Matches(pageHTML, "<[^<>]+>"))
        {
                Tag parsedTag = Tag.Parse(m.Value);

                if (Tag.IsTag(parsedTag.Name))
                {
                        parsedTag.Start = m.Index;

                        if (Regex.IsMatch(m.Value, @"\s*/\s*>$"))
                        {
                                parsedTag.End = m.Index + m.Length;

                                if (parsedTag.Name == "a")
                                        parsed.Links.Add(parsedTag);

                                        closedTags[closedTags.Count - 1].Childrens.Add(parsedTag);
                        }
                        else
                        {
                                if (Regex.IsMatch(m.Value, @"^\s*<\s*/"))
                                {
                                        string tagName = Regex.Match(m.Value, "[a-zA-Z1-6]+").Value;

                                        Tag tagElements;

                                        for (int index = openTags.Count - 1; index > -1; index--)
                                                if (Regex.IsMatch(openTags[index].Value, @"^\s*<\s*" + tagName))
                                                {
                                                        List<int> parts = new List<int>() { openTags[index].Index + openTags[index].Length };

                                                        tagElements = Tag.Parse(openTags[index].Value);

                                                        tagElements.End = m.Index + m.Value.Length;

                                                        for (int index2 = index; index2 < closedTags.Count; index2++)
                                                        {
                                                                parts.Add(closedTags[index2].Start);

                                                                parts.Add(closedTags[index2].End); //je 0

                                                                tagElements.Childrens.AddRange(closedTags[index2].Childrens);
                                                        }

                                                        parts.Add(m.Index);

                                                        openTags.RemoveRange(index, openTags.Count - index);

                                                        closedTags.RemoveRange(index, closedTags.Count - index);

                                                        closedTags[closedTags.Count - 1].Childrens.Add(tagElements);

                                                        switch (tagName.ToLower())
                                                        {
                                                                case "a":

                                                                        parsed.Links.Add(tagElements);

                                                                        break;

                                                                case "form":

                                                                        parsed.Forms.Add(tagElements);

                                                                        break;

                                                                default:

                                                                        for (int textIndex = 1; textIndex < parts.Count; textIndex += 2)
                                                                                parsed.Text += pageHTML.Substring(parts[textIndex - 1], parts[textIndex] - parts[textIndex - 1]);

                                                                        break;
                                                        }

                                                        break;
                                                }
                                }
                                else
                                {
                                        openTags.Add(m);
                                        closedTags.Add(parsedTag);
                                }
                        }
                }
        }

        return parsed;
}

Jak vidíte, zaznamenávám si počátek a konec tagu - konec párového tagu se dozvím při nalezení uzavíracího tagu. Tak do toho koukám a přemýšlím, proč mi z toho vyjde 0... :)

Děkuji.

 
Odpovědět 27.1.2013 19:03
Avatar
lcet.m
Člen
Avatar
lcet.m:

Proč se pořád bráníš tomu Html Agility Pack-u? http://htmlagilitypack.codeplex.com/ Je to hotový, poměrně dokonalý parser HTML pro .NET.

 
Nahoru Odpovědět 27.1.2013 21:01
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

Pokud chceš jen odstranit html (xml) tagy. Podívej se sem: http://www.itnetwork.cz/…ace-s-textem

Nahoru Odpovědět 27.1.2013 21:13
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na lcet.m
matesax:

No - viděl jsem Assembly - bere normálně XML parser - a ten jede přes Regex... Tak nějak nevidím výhodu mezi přímým použitím XMLReaderu.

 
Nahoru Odpovědět 28.1.2013 6:46
Avatar
lcet.m
Člen
Avatar
Odpovídá na matesax
lcet.m:

Tak to bych taky rád viděl, protože tak poprasené html, které HAP dokáže správně rozparsovat, má ke XML dost daleko...

 
Nahoru Odpovědět  +1 28.1.2013 9:32
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Zkus sem občas poslat kód programu, který se dá zobrazit bez současného rolování obrazovky a posuvníku. Tohle se nedá číst. Někdy stačí zmenšit tabulátory. Určitě bych vypustil zbytečné prázdné řádky, které máš za každým příkazem. Ovšem pokud jsi za ně placen, tak to chápu.

Metoda by neměla být delší, než na 15 řádek. Čtyřnásobné zanoření ifů promíchané s fory a switchy je také hnus, ve kterém se nedá vyznat.

Nahoru Odpovědět  +4 28.1.2013 9:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:

No nic - aktuálně píši ze svého prohlížeče... :) Odpoledne (k večeru) uveřejním alfaverzi. (Nedojde-li ke komplikacím.)

 
Nahoru Odpovědět 28.1.2013 10:36
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Řádek začínající "closedTags" máš buď chybně odsazený, anebo ti tam chybí závorky.

Nahoru Odpovědět 28.1.2013 14:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Nejlepší je nechat odsazování na editoru. Chyby se pak snáze hledají a program vypadá úhledněji.

Nahoru Odpovědět 28.1.2013 14:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.