Analizando HTML con LINQ

c# html html-agility-pack linq

Pregunta

Estoy tratando de tomar todas las celdas de una tabla HTML usando Html Agility Pack y LINQ. He cargado la fuente HTML en un HtmlAgilityPack.HtmlDocument y he seleccionado las etiquetas con LINQ. Sin embargo, después de usar foreach para iterar el resultado, se bloquea en el segundo registro.

Este es un fragmento de la fuente 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>

Y esto es lo que hice:

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

Solo devuelve el primer elemento, por ejemplo, si en lugar de usar foreach hago:

citiesText = tds.ElementAt(0);

Devuelve Nueva York , pero si intento ElementAt (1) se bloquea con la Referencia de objeto no establecida en una instancia de un objeto.

¿Alguna ayuda? Gracias

Respuesta aceptada

Debe asegurarse de que los Attributes["class"] no sean null :

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

El segundo <td> recuperado no tiene ningún atributo de class , por lo que cuando accede a los Attributes["class"] en ese caso, obtiene un null . Llamar a .Value en null está causando la excepción.

Alternativamente, puede usar GetAttributeValue :

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

Respuesta popular

Solo una conjetura, pero probablemente solo estés mirando la td del primer elemento. Tal vez usted necesita

htmlDoc.DocumentNode.Descendants ("tabla") en su lugar.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow