Html agility + немного логики ) - C#
Формулировка задачи:
Суть вопроса такая:
Есть ссылка ее содержимое, я подгружаю в string и передаю методу
Метод определения даты сообщения.
Работает так регуляркой ищет слова (Сегодня|Вчера) и заносит и в первую группу, после чего ищет часы и минуты, и заносит их во 2 и 3 группы соответственно.
Далее преобразует полученное в строку формата nxxyy, где n = 1 или 0 (1 - сегодня, 0 - вчера) xx - часы и yy - минуты. То есть 11526 означает, что объявление подано, сегодня в 15 часов 26 минут. Сделано это для последующего сравнения даты публикации объявлений, и вычисления новейшего. (но тут то и заложена проблема)
https://m.avito.ru/petrozavodsk/noutbuki
agilityHtmlLoader
, который ищет в переданной строке, последнее объявление (Время подачи объявления обрабатывается в методеTimeToNormalString
), и возвращает массивinforArticles
с данными о [0]Названии объявления
[1]Цене в рублях
[2]Ссылке на объявление
3Времени подачи
Но загвоздка в том, что он отправляет не все новые объявления, с предыдущего обновления, а только последнее, то есть допустим, я обращаюсь к методу раз в 10 минут, и если за эти 10 минут было подано 2 объявления, то вернет он мне данные о последнем поданном (, я бы конечно увеличил количество обращений к методу, но боюсь, что авито расценит это, как не совсем хорошие действия, и отправит Ip в бан, чего мне бы не хотелось. Поэтому очень прошу, помогите разобраться в ситуации, мозг начинает закипать, и на ум лезет не пойми что (. И еще просьба, я знаю, что мой код далек от идеала, хотелось бы послушать знающих людей, которые укажут мне на мои недочеты. Всем заранее спасибо. С Уважением Игорь.// Переменная, с датой последнего объявления в численном формате, дата вычисляется методом //TimeToNormalString int timeparser = 0; public string[] agilityHtmlLoader(string values) { string[] InfoArticles = new string[4]; HtmlAgilityPack.HtmlDocument PostsParser = new HtmlAgilityPack.HtmlDocument(); PostsParser.LoadHtml(values); var AllNode = PostsParser.DocumentNode.SelectNodes("//article[@class='b-item ']"); // Выбираем объявления с новейшей датой. foreach (HtmlNode node in AllNode) { if (timeparser < int.Parse(TimeToNormalString(node.SelectSingleNode("./div[@class='item-info']/div[@class='info-date info-text']").InnerText))) { timeparser = int.Parse(TimeToNormalString(node.SelectSingleNode("./div[@class='item-info']/div[@class='info-date info-text']").InnerText)); InfoArticles[0] = node.SelectSingleNode("./h3[@class='item-header']").InnerText.Replace(""", ""); if (node.SelectSingleNode("./div[@class='item-price ']") != null) InfoArticles[1] = PriceToNormalInt(node.SelectSingleNode("./div[@class='item-price ']").InnerText).ToString(); else InfoArticles[1] = "Нет цены"; InfoArticles[2] = "https://www.avito.ru" + node.SelectSingleNode("./a").Attributes["href"].Value; InfoArticles[3] = timeparser.ToString(); } } return InfoArticles; }
string TimeToNormalString(string time) { string timeConcat = ""; string pattern = @"(Сегодня|Вчера), (\d+):(\d+)"; Regex PriceCondition = new Regex(pattern, RegexOptions.IgnoreCase); MatchCollection TimeMatch = PriceCondition.Matches(time); foreach (Match times in TimeMatch) { if (timeConcat == "") { if (times.Groups[1].ToString() == "Сегодня") timeConcat = "1"; else timeConcat = "0"; } timeConcat += times.Groups[2].ToString()+times.Groups[3].ToString(); } if (timeConcat != "") return timeConcat; else return "0"; }
Решение задачи: «Html agility + немного логики )»
textual
Листинг программы
foreach (HtmlNode node in AllNode) { if (timeparser < int.Parse(TimeToNormalString(node.SelectSingleNode("./div[@class='item-info']/div[@class='info-date info-text']").InnerText)))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д