Kann eine Wildcard oder Zeichenkette "contains" in einem switch {case} verwendet werden? Vorsicht: Worth

c# html-agility-pack html-parsing screen-scraping

Frage

Da ich neu in der Programmierung bin, lese ich viel Beispielcode und versuche, Dinge zusammen zu hacken, um herauszufinden, was funktioniert. Ich arbeite mit html agility pack versucht eine Newsseite zu verschrotten.

Problem: Einer der Knoten, die ich teste, verwendet keinen statischen Wert, sondern verwendet Zeit zum Anzeigen. Wie kann ich dies auf eine Switch {Case} -Methode anwenden? Ich bin auch für irgendwelche Vorschläge offen, wenn ich in dieser ganzen Annäherung weit weg von der Basis bin.

Beachten Sie auch: Ich muss diesen Knoten nicht erfassen, wenn es eine Möglichkeit gibt, diese zu überspringen, die für mich funktioniert.

Ich entschied mich für einen Exapmle, der einen Schalter verwendet,

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

Auszug aus HTML

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

.........

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

Das Problem ist: Die sogenannte Zeitspalte ist nicht statisch, sondern verwendet einen Zeitwert. Gibt es eine Möglichkeit, eine Wildcard in diesem Fall zu verwenden, oder eine Möglichkeit, ein "contains" zu verwenden, um dieses sehr wortreiche Problem zu umgehen?

Akzeptierte Antwort

Sie müssen in jedem Fall der switch-Anweisung konstante Werte verwenden.

Der einzige Weg, den ich für Sie tun kann, ist, den default: case - in diesem Standardfall können Sie den Wert, den Sie suchen, mit einem contains , Parse oder Regex Test mit if testen.

Ich konnte Ihrem HTML-Beispielcode nicht ganz folgen (Entschuldigung!) - aber das geänderte C # könnte etwa so aussehen:

            switch (title)
            {
                case "Date":
                    HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                    Console.WriteLine("UPC=A:\t" + date.InnerText);
                    break;


                case "News":
                    string News = valueRow.InnerText;
                    Console.WriteLine("News:\t" + News);
                    break;

                default:
                    if (regexTime.Match(title))
                    {
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                    }
                    break;
            }

Beliebte Antwort

Sie könnten den "case default:" verwenden und eine Bedingung in das Feld setzen, die das überprüfen würde.

 switch (title) {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;

                    case default:
                        if (whatever you need) {
                            ...
                        }
                        break;
                }



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum