Чем парсить 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))}")); })
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д