HTML Agility Pack - всегда получать информацию о первом элементе

c# html-agility-pack

Вопрос

Я использую HTML Agility Pack для извлечения данных элемента из этого URL: Link

Я использую этот код в C # (приложение 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...!");
    }

Этот код всегда возвращает мне детали элемента. Вы можете помочь?

Я также использовал следующий код, но возникает следующая ошибка:

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

Эта ошибка для var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

Ошибка: Дополнительная информация: Ссылка на объект не установлена ​​в экземпляр объекта.

Принятый ответ

Предикат XPath для заполнения переменной butiks кажется слишком общим. contains(@class,'butik') выражение также будет соответствовать butik-large-image , butik-name и т. д., которые не имеют определенного элемента-потомка, к которому вы пытаетесь получить доступ в теле цикла foreach , возможно, это причина исключение. Попробуйте использовать более конкретный предикат, например, сопоставляя div имеющий class точно равный 'butik large' (XPath, протестированный в FirePath Firefox):

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

Популярные ответы

+ Изменить

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

к

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

Это должно вернуть 20 сложенных рекламных элементов.

Затем вы можете захватить другой NodeCollection других рекламных объявлений с помощью

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

У меня есть код HtmlAgilityPack для веб-страниц, который я могу снимать, и они могут помочь.

Изменить: вы можете присоединиться к двум спискам с помощью LINQ

butiks.Union(butiks2);


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему