Выборка через HTML Agility Pack - C#

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

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

Решил поработать с HTML Agility Pack, но порой складывается ощущение, что он чудит. Например есть следующий html-кусок:
Листинг программы
  1. <a class="link link_redir_yes serp-vacancy__source stat__click i-bem link_js_inited"
  2. data-bem="{&quot;link&quot;:{&quot;signedUrl&quot;:&quot;http://rabota-click2.yandex.ru/jsredir?state=UOgM_4YpfbEgYg81k5zwr9mGMjhv9AoDGkmQY4HED_m9c9X21afq25NmTOdiRxLYOW_d3TQaV-qg9x3fzyOKO1yLRl8L1qwtyfGglA39nRxerIVej-dqI245a75I6MbD6EjJ10VUkCaWUg4DRGx91jideQF9G68-rJAPcSj3VQC0mpB6yX7kJGdaMIqik0OmD1cskE_pIGt4lC-psHvFaW-xKv1tr8-sR7-NuCbuNlX9DB4rskVQu0Wz1NCBQ8Ghq6II2jc9hJx3BVxHp43PeqOnRZ7-ymKcjffoYpganbZjuGR_2hZkJrQfm6sgh_yqoOO6NfUnvyGZACVpjSzCFku-gBFPmJnTY53xgxV3RZF7BUyvJ7-rUTKjv0-L_3hFoqQnvfZrHH2tQkVOynq65A&amp;
  3. data=eE03aEhZNGduWC1aR1BqRE9uSW1PZS1oRTc1OHg5Y3FLUy1BQVd2bzhVSTlUNDVud3hyT0hZbUhEMEZGVzhFMDF3ZHhvM2s3U1NlcXo0YWhTVGtGYjdOckJLWE5VMFRrcE9ybEZidjVmNXNJWEFERS1hMXYyclVCZW5WbHlVNFpOMkdKMmlqS1NGTTZtaWtKcXJaS0d0MUhTU29oZjRWYVZzOWpLaGJNaG5MMWI0a1pXM3hOeEhKc1BnMVp4MkhGQl9Ecm5CRWJ3REEwQVdSSmxCT3pTX2o1eUN1RGY4UHNEOEw3MmdPbF9EWWFqajVoZmhGc1lSQUZyUkJzZmpmT2k2VDVJMVA4U3BweHRvcEMzSUhzYjltSlRIY25Md2dOVTVPMTRCemFkcG0tYkVKTzVNcF94ZHRRNlNxQ0hSbTJrajVjZDNMXzlPTlE2WFBZdkxmbGNqSGdqOVRSckdYSA&amp;
  4. b64e=2&amp;sign=67fc6608c7e2abbfc3d8dfa294df7078&amp;keyno=3&amp;text=&amp;from=rabota&amp;
  5. ref=TvdTK396TXs32EaBqW95U6vZLXqH-p6yJn4ejhqq90Fg7QfD5TFWucM1ApFnt4qiTSGXpjeUrHc&quot;}}" target="_blank"
  6. href="http://rabota-click2.yandex.ru/jsredir?state=UOgM_4YpfbEgYg81k5zwr9mGMjhv9AoDGkmQY4HED_m9c9X21afq25NmTOdiRxLYOW_d3TQaV-qg9x3fzyOKO1yLRl8L1qwtyfGglA39nRxerIVej-dqI245a75I6MbD6EjJ10VUkCaWUg4DRGx91jideQF9G68-rJAPcSj3VQC0mpB6yX7kJGdaMIqik0OmD1cskE_pIGt4lC-psHvFaW-xKv1tr8-sR7-NuCbuNlX9DB4rskVQu0Wz1NCBQ8Ghq6II2jc9hJx3BVxHp43PeqOnRZ7-ymKcjffoYpganbZjuGR_2hZkJrQfm6sgh_yqoOO6NfUnvyGZACVpjSzCFku-gBFPmJnTY53xgxV3RZF7BUyvJ7-rUTKjv0-L_3hFoqQnvfZrHH2tQkVOynq65A&amp;
  7. data=eE03aEhZNGduWC1aR1BqRE9uSW1PZS1oRTc1OHg5Y3FLUy1BQVd2bzhVSTlUNDVud3hyT0hZbUhEMEZGVzhFMDF3ZHhvM2s3U1NlcXo0YWhTVGtGYjdOckJLWE5VMFRrcE9ybEZidjVmNXNJWEFERS1hMXYyclVCZW5WbHlVNFpOMkdKMmlqS1NGTTZtaWtKcXJaS0d0MUhTU29oZjRWYVZzOWpLaGJNaG5MMWI0a1pXM3hOeEhKc1BnMVp4MkhGQl9Ecm5CRWJ3REEwQVdSSmxCT3pTX2o1eUN1RGY4UHNEOEw3MmdPbF9EWWFqajVoZmhGc1lSQUZyUkJzZmpmT2k2VDVJMVA4U3BweHRvcEMzSUhzYjltSlRIY25Md2dOVTVPMTRCemFkcG0tYkVKTzVNcF94ZHRRNlNxQ0hSbTJrajVjZDNMXzlPTlE2WFBZdkxmbGNqSGdqOVRSckdYSA&amp;
  8. b64e=2&amp;sign=67fc6608c7e2abbfc3d8dfa294df7078&amp;keyno=3&amp;text=&amp;from=rabota&amp;
  9. ref=TvdTK396TXs32EaBqW95U6vZLXqH-p6yJn4ejhqq90Fg7QfD5TFWucM1ApFnt4qiTSGXpjeUrHc">www.somesite.ru</a>
Мне нужно взять просто текст между ссылками, т.е. www.somesite.ru (сайт выдуманный). Написал следующий код:
Листинг программы
  1. var divs = document.DocumentNode.Descendants()
  2. .Where(x => x.Name == "a" && x.Attributes.Contains("class") && x.Attributes["class"].Value.Split()
  3. .Contains("serp-vacancy__source"));
Он мне один раз выдал название (www.somesite.ru), а потом перестал. Подозреваю, что библиотека может некорректно работать или в чем еще может быть причина? Заранее спасибо за ответ

Решение задачи: «Выборка через HTML Agility Pack»

textual
Листинг программы
  1. using System;
  2. using System.Threading.Tasks;
  3. using System.Net.Http;
  4. using HtmlAgilityPack;
  5.  
  6. namespace NameAndPrice
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Console.WriteLine("Please wait...\n");
  13.             ShowPrices().Wait();
  14.             Console.WriteLine("Done");
  15.  
  16.             // Delay
  17.             Console.ReadKey();
  18.         }
  19.  
  20.         private static async Task ShowPrices()
  21.         {
  22.             using (var client = new HttpClient())
  23.             {
  24.                 string html = await client.GetStringAsync("http://dila.ua/pricelist/");
  25.  
  26.                 HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
  27.                 htmlDoc.LoadHtml(html);
  28.  
  29.                 try
  30.                 {
  31.                     HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='4_2']").SelectSingleNode("//table//tbody").ChildNodes;
  32.  
  33.                     foreach (var tr in nodes)
  34.                     {
  35.                         var tds = tr.ChildNodes;
  36.                         if (tds.Count == 4)
  37.                         {
  38.                             Console.WriteLine("Название: {0}", tds[0].InnerText);
  39.                             Console.WriteLine("Цена: {0}", tds[1].InnerText);
  40.                         }
  41.                         Console.WriteLine("");
  42.                     }
  43.  
  44.                     //Console.WriteLine(htmlDoc.DocumentNode.SelectSingleNode("//div[@id='4_2']").ChildNodes.Select(x => x.Name).Aggregate((a, b) => a + ", " + b));
  45.                 }
  46.                 catch (Exception ex)
  47.                 {
  48.                     Console.WriteLine(ex.Message);
  49.                     return;
  50.                 }
  51.             }
  52.         }
  53.     }
  54. }

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


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

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

14   голосов , оценка 3.714 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут