Attraversando il DOM con HTML Agility Pack

c# html-agility-pack

Domanda

Ho difficoltà a capire come attraversare il DOM con HTML Agility Pack.

Per esempio diciamo che volevo trovare un elemento con id="gbqfsa" .

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(Url);
            var foo = from bar in doc.DocumentNode.DescendantNodes()
                          where bar.Attributes["id"].Value == "gbqfsa"
                          select bar.InnerText;

In questo momento sto facendo questo (sopra), ma foo sta venendo fuori come null . Che cosa sto facendo di sbagliato?

EDIT: Questa è la dichiarazione if che stavo usando. Stavo solo testando per vedere se gli elementi di InnerText uguali a "Ricerca Google".

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(Url);
            var foo = from bar in doc.DocumentNode.DescendantNodes()
                          where bar.Attributes["id"].Value == "gbqfsa"
                          select bar.InnerText;

Risposta accettata

Quello che dovresti fare è:

var foo = (from bar in doc.DocumentNode.DescendantNodes()
          where bar.GetAttributeValue("id", null) == "gbqfsa"
          select bar.InnerText).FirstOrDefault();

Hai dimenticato FirstOrDefault() per selezionare il primo elemento che soddisfa la condizione in where .

E sostituisco Attributes["id"].Value di GetAttributeValue("id", null) non generare un'eccezione se un elemento ha un attributo id .


Risposta popolare

Non penso che foo stia uscendo come null . Più probabilmente, bar.Attributes["id"] è nullo per alcuni degli elementi nella struttura poiché non tutti i nodi discendenti hanno una proprietà "id". Consiglierei di utilizzare il metodo GetAttributeValue , che restituirà un valore predefinito se l'attributo non viene trovato.

var foo = from bar in doc.DocumentNode.DescendantNodes()
            where bar.GetAttributeValue("id", null) == "gbqfsa"
            select bar.InnerText;



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é