Чем парсить HTML быстрее? - C#

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

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

Посоветуйте - чем парсить HTML быстрее всего? Использую

HtmlAgilityPack

, мой код парсит 12 страниц за 15+ сек
        static string GetResult(string html)
        {
            HtmlDocument doc = new HtmlDocument();
            HtmlDocument doc2 = new HtmlDocument();
            doc.LoadHtml(html);
 
            var str = string.Join("\n", doc.DocumentNode
                .SelectNodes("//a[@rel='bookmark']")
                .Where(n => n.Name == "a")
                .Select(a => a.Attributes["href"].Value)
                .Distinct()
 
                .Select(a =>
                {
                    doc2.LoadHtml(new Program().DownloadPageAsync(new Uri(a)).Result);
                    return string.Join("\n", doc2.DocumentNode
                        .SelectNodes("//div[@role='main']")
                        .Select(s => s.InnerText));
                }));
 
            return str;
        }
foreach не как не ускоряет

Что выбрать? :

1) HtmlAgilityPack
2) CsQuery
3) Fizzler
4) AngleSharp
5) Другие варианты
Расписал и ускорил на 1-2 сек. Не факт что это так...
        private void Test()
        {
            try
            {
                string uri = @"http://novoaltaysk.online/category/gorod/page/1/";
                var retrievePage = RetrievePage(uri).Result;
                var getDocument = GetDocument(retrievePage).Result;
                var getResult = GetResult(getDocument);
 
                List<string> list = new List<string>();
                foreach (var a in getResult)
                {
                    retrievePage = RetrievePage(a).Result;
                    getDocument = GetDocument(retrievePage).Result;
                    list.Add(string.Join("\n", getDocument.DocumentNode
                         .SelectNodes("//div[@role='main']")
                         .Select(s => s.InnerText)));
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
 
        private IEnumerable<string> GetResult(HtmlDocument document)
        {
            try
            {
                return document.DocumentNode
                    .SelectNodes("//a[@rel='bookmark']")
                    .Where(n => n.Name == "a")
                    .Select(a => a.Attributes["href"].Value)
                    .Distinct()
 
                    ;
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }
            return null;
        }
        private async Task<HttpResponseMessage> RetrievePage(string uri)
        {
            var client = new HttpClient();
            var result = await client.GetAsync(string.Format(uri));
            return result;
        }
        private async Task<HtmlDocument> GetDocument(HttpResponseMessage responseMessage)
        {
            string result = await responseMessage.Content.ReadAsStringAsync();
            if (!responseMessage.IsSuccessStatusCode)
                throw new FileNotFoundException("Невозможно получить документ");
 
            var document = new HtmlDocument();
            document.LoadHtml(result);
            return document;
        }

Решение задачи: «Чем парсить HTML быстрее?»

textual
Листинг программы
                    .Select(async content =>
                    {
                        var doc = new HtmlDocument();
                        doc.LoadHtml(await content.ConfigureAwait(false));
 
                        return string.Join(Environment.NewLine,
                            doc.DocumentNode.SelectNodes("//div[contains(@role,'main')]//article")
                            .Select(s => new
                            {
                                head = s.SelectNodes("//div[@class='td-post-header']//header//h1").Select(c => c.InnerText).Where(t=>!string.IsNullOrWhiteSpace(t)),
                                content = s.SelectNodes("//div[@class='td-post-content']").Select(c => c.InnerHtml)
                                .Select(c=>
                                string.Join(Environment.NewLine,
                                c.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries ).TakeWhile(a=>!a.Contains("<!--"))
                                .Select(a=>
                                {
                                    var doc2 = new HtmlDocument();
                                    doc2.LoadHtml(a);
                                    var doct = doc2.DocumentNode;
                                    string str =
                                    doct.ChildNodes.Any(b => b.InnerHtml.Contains("img")) ?
                                    string.Join(" ", doc2.DocumentNode.SelectNodes("//img").Select(d => d.Attributes["src"].Value)) :
                                    doct.InnerText;
                                    return str;
                                }).Where(t => !string.IsNullOrWhiteSpace(t))))
                            })
                            .Select(s => $"{(string.Join("",s.head))}\n{(string.Join("", s.content))}"));
                    })

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


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

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

8   голосов , оценка 3.625 из 5
Похожие ответы