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 & Date Options"><img style="position:relative; vertical-align: bottom;" src="images/misc/clock_small.gif" title="Time & Date Options" alt="Time & Date Options" border="0" /></a><a href="guestcp.php?do=customoptions" title="Time & 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?
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;
}
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;
}