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:

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

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

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

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.Attributes["class"] != null && td.Attributes["class"].Value == "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.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi