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

<table id="weekdays" cellpadding="6" cellspacing="0" border="0" width="100%">
                    <tr>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; text-align: center; width:8%; padding-left: 6px;">Date</td>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; width:8%; text-align: center; white-space:nowrap"><a href="guestcp.php?do=customoptions" title="Time &amp; Date Options"><img style="position:relative; vertical-align: bottom;" src="images/misc/clock_small.gif" title="Time &amp; Date Options" alt="Time &amp; Date Options" border="0" /></a><a href="guestcp.php?do=customoptions" title="Time &amp; Date Options"><span id="ff_nowtime_clock">3:20pm</span></a></td>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; text-align: center; width:8%;">News</td>

.........

                    <tr id="detail_row_seek_37876">

        <td id="toprow_9" class="alt1 espace" rowspan="3" style="vertical-align: top; text-align: center;" nowrap="nowrap">
            <span class="smallfont">
                <div>Sat</div>
                Apr 9
            </span>
        </td>

    <td class="alt1 espace" style="text-align: center;" nowrap="nowrap">

            <span class="smallfont">Day 3</span>


    </td>
    <td class="alt1 espace" style="text-align: center;"><span class="smallfont">EUR</span></td>
    <td class="alt1 espace" style="padding-top: 2px" align="center">


<a name="chart=37876" style="position:absolute; margin-top: -10px;"></a><a name="details=37876" style="position:absolute; margin-top: -10px;"></a>


<div class="cal_imp_medium" title="Medium Impact Expected"></div></td>
    <td class="alt1 espace">

        <div class="smallfont" id="title_37876" style="padding-left: 11px;">ECOFIN Meetings</div>

    </td>

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;
                }


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow