Html agility + немного логики ) - C#

Узнай цену своей работы

Формулировка задачи:

Суть вопроса такая: Есть ссылка
https://m.avito.ru/petrozavodsk/noutbuki
ее содержимое, я подгружаю в string и передаю методу

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("&quot;", "");
                        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;
        }
Метод определения даты сообщения. Работает так регуляркой ищет слова (Сегодня|Вчера) и заносит и в первую группу, после чего ищет часы и минуты, и заносит их во 2 и 3 группы соответственно. Далее преобразует полученное в строку формата nxxyy, где n = 1 или 0 (1 - сегодня, 0 - вчера) xx - часы и yy - минуты. То есть 11526 означает, что объявление подано, сегодня в 15 часов 26 минут. Сделано это для последующего сравнения даты публикации объявлений, и вычисления новейшего. (но тут то и заложена проблема)
 string TimeToNormalString(string time)
         {
             string timeConcat = "";
             string pattern = @"(Сегодня|Вчера),&nbsp;(\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)))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5