Analyser HTML avec LINQ

c# html html-agility-pack linq

Question

J'essaie de prendre toutes les cellules d'un tableau HTML en utilisant Html Agility Pack et LINQ. J'ai chargé la source HTML dans un fichier HtmlAgilityPack.HtmlDocument et sélectionné les balises avec LINQ. Cependant, après avoir utilisé foreach pour itérer le résultat, il se bloque dans le deuxième enregistrement.

Ceci est un fragment de la source HTML:

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

Et voici ce que j'ai fait:

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

Il ne retourne que le premier élément, par exemple si au lieu d'utiliser foreach, je fais:

citiesText = tds.ElementAt(0);

Il retourne New York , mais si j'essaie ElementAt (1), il se bloque avec référence d'objet non définie sur une instance d'objet.

De l'aide? Merci

Réponse acceptée

Vous devez vous assurer que les Attributes["class"] ne sont pas null :

var tds =
    from td in doc.DocumentNode.Descendants("td")
    where td.Attributes["class"] != null && td.Attributes["class"].Value == "city"
    select td.InnerText;

Le deuxième <td> récupéré n'a pas d'attribut de class . Ainsi, lorsque vous accédez à Attributes["class"] dans ce cas, vous obtenez une valeur null . L'appel de .Value sur null est à l'origine de l'exception.

Sinon, vous pouvez utiliser GetAttributeValue :

var tds =
    from td in doc.DocumentNode.Descendants("td")
    where td.GetAttributeValue("class", null) == "city"
    select td.InnerText;

Réponse populaire

Juste une supposition, mais vous ne regardez probablement que le td sur le premier élément. Peut-être avez-vous besoin

htmlDoc.DocumentNode.Descendants ("table") à la place.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow