HTML Agility Pack: ottieni sempre i primi dettagli sugli elementi

c# html-agility-pack

Domanda

Sto utilizzando HTML Agility Pack per recuperare i dettagli dell'elemento da questo url: Link

Sto usando questo codice in 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...!");
    }

Questo codice mi restituisce sempre i dettagli dell'elemento. Puoi aiutare?

Ho anche usato il seguente codice ma si verifica il seguente errore:

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

Questo errore è per var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

Errore: Informazioni aggiuntive: il riferimento all'oggetto non è impostato su un'istanza di un oggetto.

Risposta accettata

Il predicato XPath per popolare la variabile butiks sembra troppo generico. contains(@class,'butik') espressione butik-large-image anche butik-large-image , butik-name , ecc. che non hanno certi elementi discendenti a cui stai provando ad accedere nel corpo del ciclo foreach , che è probabilmente la causa di l'eccezione. Prova ad utilizzare un predicato più specifico, ad esempio facendo corrispondere div class esattamente uguale a 'butik large' (XPath testato in Firefox FirePath):

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

Risposta popolare

Modificare

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

A

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

Questo dovrebbe restituire i 20 elementi pubblicitari impilati.

È quindi possibile afferrare un altro NodeCollection degli altri annunci con

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

Ho a casa qualche codice per il web scraping di HtmlAgilityPack, che posso sparare come potrebbero essere d'aiuto.

Modifica: puoi unire le due liste con LINQ

butiks.Union(butiks2);


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é