Я использую 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);