Passa in rassegna tutti i discendenti di un nodo e ispezionali uno per uno

c# html-agility-pack linq xpath

Domanda

Devo fare una lista dei record in una pagina web specifica. Ho ottenuto il sorgente della pagina in un file di testo. Ho bisogno di attraversare questo nodo, elemento per elemento:

HtmlNodeCollection resultContainer = doc.DocumentNode.SelectNodes("//div[@class='result-list divider-y-5']");

Per ogni elemento ho bisogno di controllare il tipo (div, span, ecc.), È "id" e gli attributi di "classe" sono in grado di creare il mio elenco di record. Non voglio una collezione di tutti i s o s. Ciò non aiuterà perché non conosco il tipo di elemento che affronterò durante il loro ciclo. Devo controllarli tutti. Perché tutti i dati di cui ho bisogno sono figli della raccolta di nodi menzionati sopra. Eventuali suggerimenti?

Risposta accettata

foreach(HtmlNode node in resultContainer)
{
    //check node type
    switch(node.Name)
    {
        case "div":
        {
            break;
        }   
        case "p":
        {
        }
        ///....etc
    }

    //get id
    String id = node.Attributes["id"].Value;

    //get class
    String class = node.Attributes["class"].Value;

}

Risposta popolare

Penso che sia più facile avere HtmlAgilityPack convertire il documento html in xml, ad esempio:

doc.Load(htmlStream, true);
doc.OptionOutputAsXml = true;
doc.OptionFixNestedTags = true;
doc.OptionAutoCloseOnEnd = true;
doc.Save(/* your Xml stream or filename */);

Quindi utilizzare la normale API xml .NET (ad esempio, utilizzando XmlDocument o XDocument) per elaborare i contenuti.




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é