Paquete de agilidad HTML: obtenga siempre los detalles del primer elemento.

c# html-agility-pack

Pregunta

Estoy usando HTML Agility Pack para obtener los detalles del elemento de esta url: Enlace

Estoy usando este código en C # (Windows Form Application):

var webGet = new HtmlWeb();
    doc = webGet.Load("http://www.trendyol.com/Butik/Liste/Kadin");

    HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");
    richTextBox1.Text = butiks.Count().ToString();

    if (butiks != null)
    {
        foreach (HtmlNode element in butiks)
        {
            var butikUrl = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("href", null);
            var butikTitle = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("title", null);
            var butikImg = element.SelectSingleNode("//div[@class='butik-large-image']//a/img").GetAttributeValue("src", null);
            var butikEndTime = element.SelectSingleNode("//div[@class='butik-name']/div[@class='butikTimeLine']/a/div[@class='timelineMain']/h1").GetAttributeValue("enddate", null);
            dataGridView1.Rows.Add("", butikUrl, butikTitle, butikImg, butikEndTime);
        }

    }
    else
    {
        MessageBox.Show("Null Obeject...!");
    }

Este código siempre me devuelve los detalles del elemento. ¿Puede usted ayudar?

También he usado el siguiente código pero ocurre el siguiente error:

var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);
                        var butikTitle = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("title", null);
                        var butikImg = element.SelectSingleNode(".//div[@class='butik-large-image']//a/img").GetAttributeValue("src", null);
                        var butikEndTime = element.SelectSingleNode(".//div[@class='butik-name']/div[@class='butikTimeLine']/a/div[@class='timelineMain']/h1").GetAttributeValue("enddate", null);

Este error es para var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

Error: Información adicional: Referencia de objeto no establecida en una instancia de un objeto.

Respuesta aceptada

El predicado XPath para rellenar la variable butiks parece demasiado general. contains(@class,'butik') expresión contains(@class,'butik') también coincidirá con butik-large-image , butik-name , etc., que no tienen cierto elemento descendente al que intentas acceder en el cuerpo del bucle foreach , esa es posiblemente la causa de La excepción. Trate de usar un predicado más específico, por ejemplo, haciendo coincidir div tener class exactamente igual a 'butik large' (XPath probado en FirePath de Firefox):

doc.DocumentNode.SelectNodes("//div[@class='butik large']");

Respuesta popular

Cambio

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");

A

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik-large-image')]");

Esto debería devolver los 20 elementos publicitarios apilados.

A continuación, puede tomar otro NodeCollection de los otros anuncios con

HtmlNodeCollection butiks2 = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik small left')]");

Tengo un código de desguace web de HtmlAgilityPack en casa, que puedo disparar a su manera y también pueden ayudar.

Editar: Puedes unir las dos listas con LINQ

butiks.Union(butiks2);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué