Ich versuche, alle Zellen aus einer HTML-Tabelle mit Html Agility Pack und LINQ zu nehmen. Ich habe die HTML-Quelle in ein HtmlAgilityPack.HtmlDocument geladen und die Tags mit LINQ ausgewählt. Nach der Verwendung von foreach, um das Ergebnis zu iterieren, stürzt es jedoch im zweiten Datensatz ab.
Dies ist ein Fragment der HTML-Quelle:
<tr>
<td class='city'>New York</td>
<td>Card 1</td>
</tr>
<tr>
<td class='city'>London</td>
<td>Card 2</td>
</tr>
<tr>
<td class='city'>Tokyo</td>
<td>Card 3</td>
</tr>
<tr>
<td class='city'>Berlin</td>
<td>Card 4</td>
</tr>
Und das habe ich gemacht:
htmlDoc.LoadHtml(await msgRecived.Content.ReadAsStringAsync());
var tds=
from td in htmlDoc.DocumentNode.Descendants("td")
where td.Attributes["class"].Value == "city"
select td.InnerText;
foreach (var td in tds)
{
citiesText = citiesText + " " + td;
}
Es gibt nur das erste Element zurück, zB wenn ich statt foreach tue:
citiesText = tds.ElementAt(0);
Es gibt New York zurück , aber wenn ich ElementAt (1) versuche, stürzt es ab, wenn die Objektreferenz nicht auf eine Instanz eines Objekts gesetzt ist.
Irgendeine Hilfe? Vielen Dank
Sie müssen sicherstellen, dass Attributes["class"]
nicht null
:
var tds =
from td in doc.DocumentNode.Descendants("td")
where td.Attributes["class"] != null && td.Attributes["class"].Value == "city"
select td.InnerText;
Das zweite abgerufene <td>
hat kein class
Wenn Sie in diesem Fall auf Attributes["class"]
zugreifen, erhalten Sie null
. Der Aufruf von .Value
auf null
verursacht die Ausnahme.
Alternativ könnten Sie GetAttributeValue
:
var tds =
from td in doc.DocumentNode.Descendants("td")
where td.GetAttributeValue("class", null) == "city"
select td.InnerText;
Nur eine Vermutung, aber Sie betrachten wahrscheinlich nur die td auf dem ersten Element. Vielleicht brauchst du es
htmlDoc.DocumentNode.Descendants ("Tabelle") stattdessen.