Impossible d'analyser la table HTML en C # avec HtmlAgilityPack

c# html-agility-pack

Question

Je veux lire le tableau présenté dans ce lien .

Quand j'ai essayé de faire avec HtmlAgilityPack , HtmlAgilityPack null

var nodes = document.DocumentNode.SelectNodes("//table[contains(@class, 'table')]");

Pouvez-vous s'il vous plaît laissez-moi savoir quel est le problème? Est-ce que je le fais mal?

Réponse populaire

Il n'y a rien de mal avec votre xpath. Je vais juste supposer que vous ne savez pas comment extraire les données de la table. Vous devez rechercher xpath.

    public static void Main(string[] args)
    {
        HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.manualslib.com/brand/A.html");
            request.Method = "GET";
            request.ContentType = "text/html;charset=utf-8";

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    doc.Load(stream, Encoding.GetEncoding("utf-8"));
                }
            }
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Message);
        }
        //Works fine
        HtmlNode tablebody = doc.DocumentNode.SelectSingleNode("//table[contains(@class, 'table')]/tbody");
        foreach(HtmlNode tr in tablebody.SelectNodes("./tr"))
        {
            Console.WriteLine("\nTableRow: ");
            foreach(HtmlNode td in tr.SelectNodes("./td"))
            {
                if (td.GetAttributeValue("class", "null") == "col1")
                {
                    Console.Write("\t " + td.InnerText);
                }
                else
                {
                    HtmlNode temp = td.SelectSingleNode(".//div[@class='catel']/a");
                    if (temp != null)
                    {
                        Console.Write("\t " + temp.GetAttributeValue("href", "no url"));
                    }
                }


            }
        }
        Console.ReadKey();
    }

Nous allons d’abord dans le noeud, tbody avec xpath, mais seulement si l’attribut dans la classe de la table contient 'table':

    public static void Main(string[] args)
    {
        HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.manualslib.com/brand/A.html");
            request.Method = "GET";
            request.ContentType = "text/html;charset=utf-8";

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    doc.Load(stream, Encoding.GetEncoding("utf-8"));
                }
            }
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Message);
        }
        //Works fine
        HtmlNode tablebody = doc.DocumentNode.SelectSingleNode("//table[contains(@class, 'table')]/tbody");
        foreach(HtmlNode tr in tablebody.SelectNodes("./tr"))
        {
            Console.WriteLine("\nTableRow: ");
            foreach(HtmlNode td in tr.SelectNodes("./td"))
            {
                if (td.GetAttributeValue("class", "null") == "col1")
                {
                    Console.Write("\t " + td.InnerText);
                }
                else
                {
                    HtmlNode temp = td.SelectSingleNode(".//div[@class='catel']/a");
                    if (temp != null)
                    {
                        Console.Write("\t " + temp.GetAttributeValue("href", "no url"));
                    }
                }


            }
        }
        Console.ReadKey();
    }

Maintenant, nous sélectionnons tous les nœuds appelés tr (ligne du tableau):

./tr

Le point ici signifie que, dans le contexte actuel, nous allons trouver tous les nœuds de transaction. Ensuite, dans chaque nœud-tr, nous allons trouver tous les nœuds-td avec:

./td

Maintenant, dans chaque cellule du tableau, nous voulons obtenir les données. Dans le premier td, nous savons que l'attribut class est égal à 'col1'. Donc, si le td contient une classe avec cette valeur - nous voulons alors obtenir le texte à l'intérieur de ce td-node.

Si toutefois il ne contient pas cet attribut, nous savons que nous voulons la balise d'ancrage qui est à l'intérieur d'un div ayant un attribut de classe avec la valeur 'catel'.

À l'intérieur de cette balise d'ancrage, nous voulons obtenir la valeur de l'attribut href.




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