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

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

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

Решил поработать с HTML Agility Pack, но порой складывается ощущение, что он чудит. Например есть следующий html-кусок:
<a class="link link_redir_yes serp-vacancy__source stat__click i-bem link_js_inited" 
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;
data=eE03aEhZNGduWC1aR1BqRE9uSW1PZS1oRTc1OHg5Y3FLUy1BQVd2bzhVSTlUNDVud3hyT0hZbUhEMEZGVzhFMDF3ZHhvM2s3U1NlcXo0YWhTVGtGYjdOckJLWE5VMFRrcE9ybEZidjVmNXNJWEFERS1hMXYyclVCZW5WbHlVNFpOMkdKMmlqS1NGTTZtaWtKcXJaS0d0MUhTU29oZjRWYVZzOWpLaGJNaG5MMWI0a1pXM3hOeEhKc1BnMVp4MkhGQl9Ecm5CRWJ3REEwQVdSSmxCT3pTX2o1eUN1RGY4UHNEOEw3MmdPbF9EWWFqajVoZmhGc1lSQUZyUkJzZmpmT2k2VDVJMVA4U3BweHRvcEMzSUhzYjltSlRIY25Md2dOVTVPMTRCemFkcG0tYkVKTzVNcF94ZHRRNlNxQ0hSbTJrajVjZDNMXzlPTlE2WFBZdkxmbGNqSGdqOVRSckdYSA&amp;
b64e=2&amp;sign=67fc6608c7e2abbfc3d8dfa294df7078&amp;keyno=3&amp;text=&amp;from=rabota&amp;
ref=TvdTK396TXs32EaBqW95U6vZLXqH-p6yJn4ejhqq90Fg7QfD5TFWucM1ApFnt4qiTSGXpjeUrHc&quot;}}" target="_blank" 
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;
data=eE03aEhZNGduWC1aR1BqRE9uSW1PZS1oRTc1OHg5Y3FLUy1BQVd2bzhVSTlUNDVud3hyT0hZbUhEMEZGVzhFMDF3ZHhvM2s3U1NlcXo0YWhTVGtGYjdOckJLWE5VMFRrcE9ybEZidjVmNXNJWEFERS1hMXYyclVCZW5WbHlVNFpOMkdKMmlqS1NGTTZtaWtKcXJaS0d0MUhTU29oZjRWYVZzOWpLaGJNaG5MMWI0a1pXM3hOeEhKc1BnMVp4MkhGQl9Ecm5CRWJ3REEwQVdSSmxCT3pTX2o1eUN1RGY4UHNEOEw3MmdPbF9EWWFqajVoZmhGc1lSQUZyUkJzZmpmT2k2VDVJMVA4U3BweHRvcEMzSUhzYjltSlRIY25Md2dOVTVPMTRCemFkcG0tYkVKTzVNcF94ZHRRNlNxQ0hSbTJrajVjZDNMXzlPTlE2WFBZdkxmbGNqSGdqOVRSckdYSA&amp;
b64e=2&amp;sign=67fc6608c7e2abbfc3d8dfa294df7078&amp;keyno=3&amp;text=&amp;from=rabota&amp;
ref=TvdTK396TXs32EaBqW95U6vZLXqH-p6yJn4ejhqq90Fg7QfD5TFWucM1ApFnt4qiTSGXpjeUrHc">www.somesite.ru</a>
Мне нужно взять просто текст между ссылками, т.е. www.somesite.ru (сайт выдуманный). Написал следующий код:
var divs = document.DocumentNode.Descendants()
                .Where(x => x.Name == "a" && x.Attributes.Contains("class") && x.Attributes["class"].Value.Split()
                .Contains("serp-vacancy__source"));
Он мне один раз выдал название (www.somesite.ru), а потом перестал. Подозреваю, что библиотека может некорректно работать или в чем еще может быть причина? Заранее спасибо за ответ

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

textual
Листинг программы
using System;
using System.Threading.Tasks;
using System.Net.Http;
using HtmlAgilityPack;
 
namespace NameAndPrice
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please wait...\n");
            ShowPrices().Wait();
            Console.WriteLine("Done");
 
            // Delay
            Console.ReadKey();
        }
 
        private static async Task ShowPrices()
        {
            using (var client = new HttpClient())
            {
                string html = await client.GetStringAsync("http://dila.ua/pricelist/");
 
                HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
                htmlDoc.LoadHtml(html);
 
                try
                {
                    HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='4_2']").SelectSingleNode("//table//tbody").ChildNodes;
 
                    foreach (var tr in nodes)
                    {
                        var tds = tr.ChildNodes;
                        if (tds.Count == 4)
                        {
                            Console.WriteLine("Название: {0}", tds[0].InnerText);
                            Console.WriteLine("Цена: {0}", tds[1].InnerText);
                        }
                        Console.WriteLine("");
                    }
 
                    //Console.WriteLine(htmlDoc.DocumentNode.SelectSingleNode("//div[@id='4_2']").ChildNodes.Select(x => x.Name).Aggregate((a, b) => a + ", " + b));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return;
                }
            }
        }
    }
}

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


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

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

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