No se puede analizar la tabla html en C # usando HtmlAgilityPack

c# html-agility-pack

Pregunta

Quiero leer la tabla que se muestra en este enlace .

Cuando intenté hacerlo con HtmlAgilityPack , HtmlAgilityPack un null

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

¿Puedes por favor dejarme saber cuál es el problema? ¿Lo estoy haciendo de manera incorrecta?

Respuesta popular

No hay nada malo con tu xpath. Voy a asumir que no sabes cómo sacar los datos de la tabla. Necesitas buscar xpaths.

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

Primero vamos al nodo, tbody con xpath, pero solo si el atributo en la clase en la tabla contiene 'tabla':

//table[contains(@class, 'table')]/tbody

Ahora seleccionamos todos los nodos llamados tr (fila de la tabla):

./tr

El punto aquí significa que a partir del contexto actual en el que estamos, vamos a encontrar todos los nodos tr. Luego, en cada tr-nodo vamos a encontrar todos los td-nodos con:

./td

Ahora en cada celda de la tabla queremos obtener los datos. En la primera td sabemos que el atributo de clase es igual a 'col1'. Entonces, si el td contiene una clase con ese valor, entonces queremos obtener el texto dentro de ese td-node.

Sin embargo, si no contiene ese atributo, sabemos que queremos la etiqueta de anclaje que está dentro de una div que tiene un atributo de clase con el valor 'catel'.

Dentro de esa etiqueta de anclaje queremos obtener el valor del atributo href.



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