Analisi HTML con LINQ

c# html html-agility-pack linq

Domanda

Sto cercando di rimuovere tutte le celle da una tabella HTML utilizzando Html Agility Pack e LINQ. Ho caricato il codice sorgente HTML in HtmlAgilityPack.HtmlDocument e ho selezionato i tag con LINQ. Tuttavia, dopo aver usato foreach per iterare il risultato, si blocca nel secondo record.

Questo è un frammento della sorgente 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>

E questo è quello che ho fatto:

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

Restituisce solo il primo elemento, ad esempio se invece di usare foreach lo faccio:

citiesText = tds.ElementAt(0);

Restituisce New York , ma se provo ElementAt (1) si blocca con il riferimento all'oggetto non impostato su un'istanza di un oggetto.

Qualsiasi aiuto? Grazie

Risposta accettata

Devi assicurarti che Attributes["class"] non sia null :

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

Il secondo <td> recuperato non ha attributo di class , quindi quando si accede ad Attributes["class"] in quel caso, si ottiene null . La chiamata .Value su null causa l'eccezione.

In alternativa è possibile utilizzare GetAttributeValue :

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

Risposta popolare

Solo un'ipotesi, ma probabilmente stai solo guardando il td sul primo elemento. Forse hai bisogno

htmlDoc.DocumentNode.Descendants ("tabella") invece.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché