HTML Agility Pack-Obtenez toujours les détails du premier élément

c# html-agility-pack

Question

J'utilise HTML Agility Pack pour récupérer les détails de l'élément à partir de cette URL: Lien

J'utilise ce code en C # (Application Windows Form):

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...!");
    }

Ce code me renvoie toujours les détails de l'élément. Pouvez vous aider?

J'ai également utilisé le code suivant, mais l'erreur suivante se produit:

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

Cette erreur concerne var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

Erreur: Informations supplémentaires: La référence à l'objet n'est pas définie sur une instance d'objet.

Réponse acceptée

Le prédicat XPath pour peupler la variable butiks semble trop général. contains(@class,'butik') expression correspondra également à butik-large-image , butik-name , etc., qui ne possèdent pas certains éléments descendants auxquels vous essayez d'accéder dans le corps de la boucle foreach , c'est peut-être la cause l'éxéption. Essayez d'utiliser un prédicat plus spécifique, par exemple en faisant correspondre la class div dont la class exactement égale à 'butik large' (XPath testé dans FirePath de Firefox):

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

Réponse populaire

Changement

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

À

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

Cela devrait renvoyer les 20 éléments publicitaires empilés.

Vous pouvez ensuite récupérer une autre NodeCollection des autres annonces avec

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

J'ai un code de déchirage Web HtmlAgilityPack à la maison, que je peux utiliser pour vous aider.

Edit: Vous pouvez joindre les deux listes avec LINQ

butiks.Union(butiks2);



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