{"id":502792,"date":"2026-11-11T18:43:20","date_gmt":"2026-11-11T15:43:20","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=502792"},"modified":"2026-11-11T18:43:20","modified_gmt":"2026-11-11T15:43:20","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=502792","title":{"rendered":"\u041a\u0430\u043a \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c HTML \u0432 10\u201330 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 HtmlAgilityPack \u0438 AngleSharp: \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u043e DOM"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c: \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438, \u0446\u0435\u043d\u044b, \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043e\u0447\u0435\u0432\u0430\u043b \u043c\u043e\u0439 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 HTML-\u043f\u0430\u0440\u0441\u0435\u0440. \u041e\u043d \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443 \u0431\u044b\u043b\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u043b\u043e\u0432\u043a\u043e: \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043d\u0435 \u0441\u0430\u0439\u0442\u044b, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430 \u0434\u0432\u0443\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u043e\u0432\u0441\u0435. \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0438\u0448\u043a\u0430 \u0438 \u0434\u043e\u0434\u0435\u043b\u0430\u043b\u0430 \u0442\u043e \u0447\u0442\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043b\u0435\u043d\u044c \u0438 \u044f \u0432\u044b\u043b\u043e\u0436\u0438\u043b nuget: z3l.FastHtmlParser<\/p>\n<p>\u041d\u0438\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0432\u043f\u0443\u0441\u0442\u0443\u044e \u0442\u0440\u0430\u0442\u044f\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0443\u0439\u0442\u0438 \u043e\u0442 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 DOM \u0438 \u0433\u0434\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 DOM \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430<\/strong><\/p>\n<p>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0431\u044a\u0451\u043c\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 \u0441\u0443\u0442\u043a\u0438, \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0433\u043e\u0440\u044f\u0447\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c, \u0430 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0440\u0430\u0441\u0442\u0443\u0442 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041b\u0438\u0434\u0435\u0440\u044b \u0440\u044b\u043d\u043a\u0430 \u0432 .NET \u2014 HtmlAgilityPack \u0438 AngleSharp \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u043e \u0440\u0435\u0448\u0430\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u043d\u0438 \u0441\u0442\u0440\u043e\u044f\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 DOM: \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b, \u0434\u043e\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u044f\u0432\u043d\u044b\u0435 &lt;html&gt;, &lt;head&gt;, &lt;tbody&gt;, \u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043c\u0443\u0442\u0430\u0446\u0438\u0439 \u0438 \u043e\u0431\u0445\u043e\u0434\u0430 CSS-\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043d\u0430\u0439\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u0448\u043d\u044e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 (GC).<\/p>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438\u0434\u0435\u044f: \u043d\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0443\u0441\u043a\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p><strong>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/strong><\/p>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434: BenchmarkDotNet 0.15.8, .NET 10, Intel Xeon E-2236, Windows Server 2025. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0441 <a href=\"http:\/\/books.toscrape.com\" rel=\"noopener nofollow\">books.toscrape.com<\/a>, <a href=\"http:\/\/quotes.toscrape.com\" rel=\"noopener nofollow\">quotes.toscrape.com<\/a> \u0438 <a href=\"http:\/\/webscraper.io\/test-sites\" rel=\"noopener nofollow\">webscraper.io\/test-sites<\/a>. \u0412\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a: AngleSharp 1.10.0, HtmlAgilityPack 1.13.1.<\/p>\n<p><strong>1. \u0422\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b:<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>z3l.FastHtmlParser<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>HtmlAgilityPack<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>AngleSharp<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">quotes, 11 \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>19,1 \u043c\u043a\u0441 \/ 10,8   \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">173,8 \u043c\u043a\u0441 \/ 243   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">260,4 \u043c\u043a\u0441 \/ 189   \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">laptops, 38 \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>56,9 \u043c\u043a\u0441 \/ 30,7   \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">583,8 \u043c\u043a\u0441 \/ 713   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">1 096,4 \u043c\u043a\u0441 \/   608 \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">books, 51 \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>61,0 \u043c\u043a\u0441 \/ 39,2   \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">625,8 \u043c\u043a\u0441 \/ 812   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">1 087,5 \u043c\u043a\u0441 \/   663 \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">books \u0431\u0435\u0437   &lt;\/li&gt; \u0438   &lt;\/p&gt;, 51   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>63,4 \u043c\u043a\u0441 \/ 39,2   \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">728,5 \u043c\u043a\u0441 \/ 756   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">1 044,4 \u043c\u043a\u0441 \/   644 \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">books \u00d710, 510   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>0,66 \u043c\u0441 \/ 391   \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">20,9 \u043c\u0441 \/ 8,1   \u041c\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">13,8 \u043c\u0441 \/ 6,3   \u041c\u0411<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>2. \u041f\u043e\u043b\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438.<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0417\u0430\u0434\u0430\u0447\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>z3l.FastHtmlParser<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>HtmlAgilityPack<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>AngleSharp<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">20 \u043a\u043d\u0438\u0433:   \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0446\u0435\u043d\u0430, \u0440\u0435\u0439\u0442\u0438\u043d\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>71 \u043c\u043a\u0441 \/ 45 \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">862 \u043c\u043a\u0441 \/ 1 038   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">1 160 \u043c\u043a\u0441 \/ 707   \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10 \u0446\u0438\u0442\u0430\u0442:   \u0442\u0435\u043a\u0441\u0442, \u0430\u0432\u0442\u043e\u0440, \u0442\u0435\u0433\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>24 \u043c\u043a\u0441 \/ 18 \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">257 \u043c\u043a\u0441 \/ 401   \u041a\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">292 \u043c\u043a\u0441 \/ 228   \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 10 \u0440\u0430\u0437 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 12\u201323 \u0440\u0430\u0437\u0430 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043e\u0442\u0440\u044b\u0432 \u043e\u0442 HtmlAgilityPack \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e 33 \u0440\u0430\u0437.<\/p>\n<h4>\u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: \u0432\u044b\u0434\u0430\u0447\u0430 Amazon<\/h4>\n<p>\u0423\u0447\u0435\u0431\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0435 \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435. \u0414\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0430 \u044f \u0432\u0437\u044f\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0432\u044b\u0434\u0430\u0447\u0438 Amazon: 1 \u041c\u0411 \u0432\u0435\u0441\u0430, \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u0442\u043d\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 &lt;script&gt;, \u043e\u043a\u043e\u043b\u043e 4 \u0442\u044b\u0441\u044f\u0447 \u0442\u0435\u0433\u043e\u0432. \u0417\u0430\u0434\u0430\u0447\u0430: \u0438\u0437 27 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u044c ASIN, \u0446\u0435\u043d\u0443, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a Prime.<\/p>\n<pre><code class=\"cs\">foreach (var row in new HtmlParser(html).FindAll(HtmlTag.Div, cls: \"s-result-item\")){    var asin = row.AttributeByName(\"data-asin\");    if (string.IsNullOrEmpty(asin)) continue;    var price = row.Find(HtmlTag.Span, cls: \"a-price\");    var name = row.Find(HtmlTag.H2).Text();    var whole = price.Find(HtmlTag.Span, cls: \"a-price-whole\").Text();     \/\/ null, \u0435\u0441\u043b\u0438 \u0446\u0435\u043d\u044b \u043d\u0435\u0442    var rating = row.Find(HtmlTag.I, cls: \"a-icon-star-mini\")                    .Find(HtmlTag.Span, cls: \"a-icon-alt\").Text();          \/\/ \"4.2 out of 5 stars\"    \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>Amazon, 1 \u041c\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>z3l.FastHtmlParser<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>HtmlAgilityPack<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>AngleSharp<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u0431\u043e\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>0,72 \u043c\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">12,3 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">16,3 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u0431\u043e\u0440 + 27   \u0442\u043e\u0432\u0430\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>0,90 \u043c\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">18,0 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">19,8 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0430\u043c\u044f\u0442\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 23\u201329 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442 \u0438\u0437-\u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0430\u0432, \u043d\u043e \u0441\u0430\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 (LocalScrapeBenchmarks): \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 HTML \u0432\u044b\u0434\u0430\u0447\u0438 \u0432 benchmarks\/local\/amazon*.html \u0438 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e<\/h3>\n<h4>1. \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0433\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e DOM<\/h4>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 List&lt;ParserTag&gt; \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b:<\/p>\n<pre><code class=\"cs\">public class ParserTag{    public int Start { get; }        \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f '&lt;'    public int End { get; }          \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e '&gt;'    public int InnerStart { get; }   \/\/ \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u0433\u0430    public int InnerEnd { get; }     \/\/ \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0433\u043e\u043c    public int Depth { get; }    \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043a\u0441\u0442, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 HTML \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e \u0441\u0440\u0435\u0437\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438, \u0434\u0435\u0442\u0438, \u0441\u043e\u0441\u0435\u0434\u0438) \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b: \u043f\u043e\u0442\u043e\u043c\u043a\u0438 \u0442\u0435\u0433\u0430 \u0438\u0434\u0443\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043d\u0438\u043c, \u043f\u043e\u043a\u0430 \u0438\u0445 End \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0435\u0433\u043e End.<\/p>\n<h4>2. \u041f\u0430\u043c\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0440\u043e\u0432\u043d\u043e \u043f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0433 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u0430 &lt;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 pagesource.Count(&#8216;&lt;&#8216;) \u0434\u0430\u0451\u0442 \u043d\u0430\u0434\u0451\u0436\u043d\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0438\u0441\u043b\u0430 \u0442\u0435\u0433\u043e\u0432. \u0420\u0430\u0437\u0431\u043e\u0440 \u0438\u0434\u0451\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u0437 ArrayPool, \u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430:<\/p>\n<pre><code class=\"cs\">int maxTags = pagesource.Count('&lt;');ParserTag[] tags = ArrayPool&lt;ParserTag&gt;.Shared.Rent(maxTags);TagState[] states = ArrayPool&lt;TagState&gt;.Shared.Rent(maxTags);\/\/ ... \u0440\u0430\u0437\u0431\u043e\u0440 ...var result = new List&lt;ParserTag&gt;(count);CollectionsMarshal.SetCount(result, count);tags.AsSpan(0, count).CopyTo(CollectionsMarshal.AsSpan(result));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0434\u0432\u043e\u0435\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440\u0430 List&lt;T&gt; \u043f\u043e \u043c\u0435\u0440\u0435 \u0447\u0442\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0432 \u043f\u0443\u043b \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0447\u0438\u0449\u0430\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.<\/p>\n<h4>3. \u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434<\/h4>\n<p>\u0412\u043d\u0435 \u0442\u0435\u0433\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u0432\u043e\u043b &lt;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043d\u0435\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 IndexOf. \u0412\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0433\u0430 \u0432\u0430\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e &lt;, = \u0438 &gt;, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d IndexOfAny. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0440\u043e\u0434\u0435 data-x=&#187;&lt;p&gt;&#8230;&lt;\/p&gt;&#187; \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u043b\u043e\u043c\u0430\u044e\u0442.<\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 script, style, textarea, title \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c HTML5 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u044b\u0440\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0430 \u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u043e\u0439. \u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e &lt;\/script \u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0433\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u0431\u0435\u0437 \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h4>4. \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u0433\u0438 \u0431\u0435\u0437 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430<\/h4>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0433 \u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0430\u0437\u0430\u0434 \u043f\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u041e(n2). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 ParserTag \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u0437 \u043f\u0443\u043b\u0430, \u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0442\u0435\u0433\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<pre><code class=\"cs\">private struct TagState{    public int Key;      \/\/ (int)HtmlTag \u0438\u043b\u0438 -1 \u0434\u043b\u044f \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438    public int Depth;    public bool Open;    public int PrevOpen; \/\/ \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0442\u0435\u0433\u043e\u0432    public int NextOpen;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432. \u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u0443\u0437\u0435\u043b \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430 O(1). \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0434\u0443\u0442 \u043f\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c, \u0430 \u043d\u0435 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c.<\/p>\n<h4>5. \u0418\u043c\u0435\u043d\u0430 \u0442\u0435\u0433\u043e\u0432 \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u043e\u043a<\/h4>\n<p>\u0418\u043c\u044f \u0442\u0435\u0433\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u2014 \u044d\u0442\u043e ReadOnlySpan&lt;char&gt;. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b, \u043f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Dictionary&lt;string, HtmlTag&gt;.AlternateLookup&lt;ReadOnlySpan&lt;char&gt;&gt; \u0438\u0437 .NET 9. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c int.<\/p>\n<p>FrozenDictionary, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 \u0442\u0430\u043a\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043d\u0430 \u044d\u0442\u0438\u0445 \u0437\u0430\u043c\u0435\u0440\u0430\u0445 \u0443\u0441\u0442\u0443\u043f\u0438\u043b:<\/p>\n<p>\u25cf\u00a0\u00a0\u00a0\u00a0 \u0442\u0440\u0430\u0442\u0438\u043b \u043e\u043a\u043e\u043b\u043e 16 \u043c\u0441 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0432 JIT \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 Dictionary \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u0430 ~2 \u043c\u0441);<br \/>\u25cf\u00a0\u00a0\u00a0\u00a0 \u043f\u043e\u0434 \u044d\u0442\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 30% \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Dictionary \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u043e\u043c:<\/p>\n<pre><code class=\"cs\">\/\/ \u0425\u0435\u0448: \u0434\u043b\u0438\u043d\u0430 \u0438 \u0442\u0440\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0430 \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435private static int Hash(ReadOnlySpan&lt;char&gt; s){    if (s.IsEmpty) return 0;    return (int)(((uint)s.Length &lt;&lt; 16) ^ (Upper(s[0]) &lt;&lt; 8) ^ Upper(s[^1]) ^ (Upper(s[s.Length &gt;&gt; 1]) &lt;&lt; 21));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f ASCII \u0435\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0443\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 | 0x20. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 OrdinalIgnoreCase. \u0414\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 ASCII-\u0438\u043c\u0435\u043d \u0442\u0435\u0433\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0422\u043e\u0442 \u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b HTML-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 (\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0435\u0433\u0438, SVG) \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 stackalloc \u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.<\/p>\n<h4>6. \u0417\u0430\u043f\u0440\u043e\u0441\u044b: \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0431\u0435\u0437 IEnumerable<\/h4>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u2014 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432:<\/p>\n<pre><code class=\"cs\">doc.Find(HtmlTag.Div, id: \"contacts\")   .Find(HtmlTag.A, cls: \"phone\")   .NextSibling(HtmlTag.Span)   .Text();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 DOM-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0448\u0430\u0433 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 IEnumerable (FirstOrDefault, Descendants, Where), \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u044b Find, Parent, Next \u0438 NextSibling \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0434\u0438\u043d ParserTag. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b for \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0441\u043f\u0438\u0441\u043a\u0430:<\/p>\n<pre><code class=\"cs\">public static ParserTag? Find(this ITagSearchable? scope, in TagQuery query){    if (scope == null) return null;    scope.GetScope(out var tags, out int first, out int end);    for (int i = first, count = tags.Count; i &lt; count; i++)    {        var tag = tags[i];        if (tag.End &gt; end) break;        if (query.Matches(tag)) return tag;    }        return null;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>TagQuery \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 (in), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044f\u0441\u044c \u043d\u0430 \u0441\u0442\u0435\u043a\u0435. \u0412\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0448\u0435 \u0431\u0435\u0437 .Text() \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 <strong>0 \u0431\u0430\u0439\u0442<\/strong> \u0432 \u043a\u0443\u0447\u0435 (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 GC.GetAllocatedBytesForCurrentThread()). \u0410\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0435 .Text() (32 \u0431\u0430\u0439\u0442\u0430). \u041b\u0435\u043d\u0438\u0432\u044b\u0439 IEnumerable \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443 FindAll \u0438 Children, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u0435\u043d.<\/p>\n<p>\u0426\u0435\u043f\u043e\u0447\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b \u043a null: \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 null \u0431\u0435\u0437 \u0432\u044b\u0431\u0440\u043e\u0441\u0430 NullReferenceException.<\/p>\n<h3>\u0411\u0438\u0442\u044b\u0439 HTML \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438<\/h3>\n<p>\u041d\u0430 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0445 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0432\u0441\u043a\u0440\u044b\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<pre><code class=\"xml\">&lt;ul&gt;&lt;li&gt;One&lt;li&gt;Two&lt;li&gt;Three&lt;\/ul&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Text() \u0443 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 &lt;li&gt; \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0441\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e. \u0422\u0430 \u0436\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b\u0430\u0441\u044c \u0441 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c\u0438 &lt;p&gt;, &lt;td&gt;, &lt;dt&gt;\/&lt;dd&gt;, &lt;option&gt;. \u041f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 HTML5 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b, \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p>\u042f \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0442\u0440\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<p>1.\u00a0\u00a0\u00a0 <strong>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 HTML5 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/strong> \u041d\u043e\u0432\u044b\u0439 &lt;li&gt; \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 &lt;li&gt;, \u0431\u043b\u043e\u0447\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 &lt;p&gt;. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u0437\u0430\u0432\u0435\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043f\u0430\u043b\u0430 \u043d\u0430 4\u20139%. \u041e\u043a\u043e\u043b\u043e 4% \u043e\u0442\u043d\u0438\u043c\u0430\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0435\u0449\u0451 1% \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0431\u0443\u043a\u0432\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 &lt;.<\/p>\n<p>2.\u00a0\u00a0\u00a0 <strong>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0440\u0430\u0437\u0431\u043e\u0440.<\/strong> \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u0415\u0441\u043b\u0438 \u043d\u0430 &lt;\/ul&gt; \u0432 \u0441\u0442\u0435\u043a\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u0443\u0441\u043e\u043a. \u0418\u0442\u043e\u0433 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u044c\u043d\u044b\u043c: \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 books \u0431\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0442\u0435\u0433\u043e\u0432 \u0440\u0430\u0437\u0431\u043e\u0440 \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u043b\u0441\u044f \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u2014 \u0441 61 \u0434\u043e 119 \u043c\u043a\u0441. \u0412\u0441\u0435 20 \u043a\u043d\u0438\u0433 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u0431\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 &lt;ol&gt;, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 120% \u043e\u0431\u044a\u0451\u043c\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>3.\u00a0\u00a0\u00a0 <strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0442\u0435\u0433\u0430.<\/strong> \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f &lt;li&gt;, \u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u0441\u0442\u0435\u043a\u0430 \u0432\u0438\u0441\u0438\u0442 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 &lt;li&gt;, \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0431\u0435\u0437 \u043e\u0442\u043a\u0430\u0442\u0430. \u042d\u0442\u043e \u043e\u0434\u043d\u043e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430 \u0442\u0435\u0433\u043e\u0432: li, td, tr, dt, dd, option. \u041e\u0442\u043a\u0430\u0442 \u043d\u0430\u0437\u0430\u0434 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0434\u043a\u0438\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0442\u043e\u043b\u043e\u0433\u0438\u0439 \u0432\u0438\u0434\u0430 &lt;li&gt;&lt;span&gt;a&lt;li&gt;b.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0412\u0430\u0440\u0438\u0430\u043d\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>books, 51 \u041a\u0411<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>books \u0431\u0435\u0437   &lt;\/li&gt; \u0438   &lt;\/p&gt;<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1.0: \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u0438\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">56 \u043c\u043a\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e   \u0442\u0435\u043a\u0441\u0442\u044b \u043f\u0443\u0441\u0442\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432   \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">63 \u043c\u043a\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">63 \u043c\u043a\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434   + \u043e\u0442\u043a\u0430\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">60 \u043c\u043a\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">119 \u043c\u043a\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0438   \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0442\u0435\u0433\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>61 \u043c\u043a\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>63 \u043c\u043a\u0441<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0413\u0434\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442<\/h3>\n<p>\u0412\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0437\u0430 \u0441\u0447\u0451\u0442 \u043e\u0442\u043a\u0430\u0437\u0430 \u043e\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0439 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0438\u0436\u0435, \u043b\u0443\u0447\u0448\u0435 \u0432\u0437\u044f\u0442\u044c AngleSharp:<\/p>\n<p>\u25cf\u00a0\u00a0\u00a0\u00a0 \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 CSS-\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 XPath (\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u044b Find\/FindAll\/TagQuery), \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u0430\u0441\u043a\u0430\u0442\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e<br \/>\u25cf\u00a0\u00a0\u00a0\u00a0 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435);<br \/>\u25cf\u00a0\u00a0\u00a0\u00a0 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 (&lt;html&gt;, &lt;tbody&gt;);<br \/>\u25cf\u00a0\u00a0\u00a0\u00a0 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 .NET 9 \u0438 .NET 10 (\u0438\u0437-\u0437\u0430 AlternateLookup).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435.<\/p>\n<h3>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f<\/h3>\n<p>\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u0442. \u041f\u043b\u0430\u0442\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u0438 \u043f\u043b\u0430\u0442\u0435\u0436 \u0440\u0430\u0437\u043e\u0432\u044b\u0439. \u041d\u0443 \u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u0442 )<\/p>\n<p>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043b\u0438\u0446 \u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0441 \u0433\u043e\u0434\u043e\u0432\u043e\u0439 \u0432\u044b\u0440\u0443\u0447\u043a\u043e\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 $1 \u043c\u043b\u043d \u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u0435\u043d\u044c\u0448\u0435 100 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0440\u0443\u043f\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f: \u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043b\u0430\u0442\u0451\u0436 $1000, \u0431\u0435\u0441\u0441\u0440\u043e\u0447\u043d\u043e, \u043d\u0430 \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u043d\u0430 GitHub.<\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438<\/h3>\n<p>\u25cf\u00a0\u00a0\u00a0\u00a0 GitHub: <a href=\"https:\/\/github.com\/romanti3172\/z3l.FastHtmlParser\" rel=\"noopener nofollow\">https:\/\/github.com\/romanti3172\/z3l.FastHtmlParser<\/a><br \/>\u25cf\u00a0\u00a0\u00a0\u00a0 NuGet: <a href=\"https:\/\/www.nuget.org\/packages\/z3l.FastHtmlParser\" rel=\"noopener nofollow\">https:\/\/www.nuget.org\/packages\/z3l.FastHtmlParser<\/a><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1106746\/\">https:\/\/habr.com\/ru\/articles\/1106746\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c: \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438, \u0446\u0435\u043d\u044b, \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f. \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043e\u0447\u0435\u0432\u0430\u043b \u043c\u043e\u0439 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 HTML-\u043f\u0430\u0440\u0441\u0435\u0440. \u041e\u043d \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443 \u0431\u044b\u043b\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u043b\u043e\u0432\u043a\u043e: \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043d\u0435 \u0441\u0430\u0439\u0442\u044b, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430 \u0434\u0432\u0443\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u043e\u0432\u0441\u0435. \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0438\u0448\u043a\u0430 \u0438 \u0434\u043e\u0434\u0435\u043b\u0430\u043b\u0430 \u0442\u043e \u0447\u0442\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043b\u0435\u043d\u044c \u0438 \u044f \u0432\u044b\u043b\u043e\u0436\u0438\u043b nuget: z3l.FastHtmlParser\u041d\u0438\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0432\u043f\u0443\u0441\u0442\u0443\u044e \u0442\u0440\u0430\u0442\u044f\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0443\u0439\u0442\u0438 \u043e\u0442 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 DOM \u0438 \u0433\u0434\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.\u041f\u043e\u0447\u0435\u043c\u0443 DOM \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0431\u044a\u0451\u043c\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 \u0441\u0443\u0442\u043a\u0438, \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0433\u043e\u0440\u044f\u0447\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c, \u0430 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0440\u0430\u0441\u0442\u0443\u0442 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e.\u041b\u0438\u0434\u0435\u0440\u044b \u0440\u044b\u043d\u043a\u0430 \u0432 .NET \u2014 HtmlAgilityPack \u0438 AngleSharp \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u043e \u0440\u0435\u0448\u0430\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u043d\u0438 \u0441\u0442\u0440\u043e\u044f\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 DOM: \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b, \u0434\u043e\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u044f\u0432\u043d\u044b\u0435 &lt;html&gt;, &lt;head&gt;, &lt;tbody&gt;, \u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043c\u0443\u0442\u0430\u0446\u0438\u0439 \u0438 \u043e\u0431\u0445\u043e\u0434\u0430 CSS-\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438.\u0414\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043d\u0430\u0439\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u0448\u043d\u044e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 (GC).\u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438\u0434\u0435\u044f: \u043d\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0443\u0441\u043a\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434: BenchmarkDotNet 0.15.8, .NET 10, Intel Xeon E-2236, Windows Server 2025. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0441 books.toscrape.com, quotes.toscrape.com \u0438 webscraper.io\/test-sites. \u0412\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a: AngleSharp 1.10.0, HtmlAgilityPack 1.13.1.1. \u0422\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b:\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430z3l.FastHtmlParserHtmlAgilityPackAngleSharpquotes, 11 \u041a\u041119,1 \u043c\u043a\u0441 \/ 10,8   \u041a\u0411173,8 \u043c\u043a\u0441 \/ 243   \u041a\u0411260,4 \u043c\u043a\u0441 \/ 189   \u041a\u0411laptops, 38 \u041a\u041156,9 \u043c\u043a\u0441 \/ 30,7   \u041a\u0411583,8 \u043c\u043a\u0441 \/ 713   \u041a\u04111 096,4 \u043c\u043a\u0441 \/   608 \u041a\u0411books, 51 \u041a\u041161,0 \u043c\u043a\u0441 \/ 39,2   \u041a\u0411625,8 \u043c\u043a\u0441 \/ 812   \u041a\u04111 087,5 \u043c\u043a\u0441 \/   663 \u041a\u0411books \u0431\u0435\u0437   &lt;\/li&gt; \u0438   &lt;\/p&gt;, 51   \u041a\u041163,4 \u043c\u043a\u0441 \/ 39,2   \u041a\u0411728,5 \u043c\u043a\u0441 \/ 756   \u041a\u04111 044,4 \u043c\u043a\u0441 \/   644 \u041a\u0411books \u00d710, 510   \u041a\u04110,66 \u043c\u0441 \/ 391   \u041a\u041120,9 \u043c\u0441 \/ 8,1   \u041c\u041113,8 \u043c\u0441 \/ 6,3   \u041c\u04112. \u041f\u043e\u043b\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438.\u0417\u0430\u0434\u0430\u0447\u0430z3l.FastHtmlParserHtmlAgilityPackAngleSharp20 \u043a\u043d\u0438\u0433:   \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0446\u0435\u043d\u0430, \u0440\u0435\u0439\u0442\u0438\u043d\u043371 \u043c\u043a\u0441 \/ 45 \u041a\u0411862 \u043c\u043a\u0441 \/ 1 038   \u041a\u04111 160 \u043c\u043a\u0441 \/ 707   \u041a\u041110 \u0446\u0438\u0442\u0430\u0442:   \u0442\u0435\u043a\u0441\u0442, \u0430\u0432\u0442\u043e\u0440, \u0442\u0435\u0433\u043824 \u043c\u043a\u0441 \/ 18 \u041a\u0411257 \u043c\u043a\u0441 \/ 401   \u041a\u0411292 \u043c\u043a\u0441 \/ 228   \u041a\u0411\u041d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 10 \u0440\u0430\u0437 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 12\u201323 \u0440\u0430\u0437\u0430 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043e\u0442\u0440\u044b\u0432 \u043e\u0442 HtmlAgilityPack \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e 33 \u0440\u0430\u0437.\u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: \u0432\u044b\u0434\u0430\u0447\u0430 Amazon\u0423\u0447\u0435\u0431\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0435 \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435. \u0414\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0430 \u044f \u0432\u0437\u044f\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0432\u044b\u0434\u0430\u0447\u0438 Amazon: 1 \u041c\u0411 \u0432\u0435\u0441\u0430, \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u0442\u043d\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 &lt;script&gt;, \u043e\u043a\u043e\u043b\u043e 4 \u0442\u044b\u0441\u044f\u0447 \u0442\u0435\u0433\u043e\u0432. \u0417\u0430\u0434\u0430\u0447\u0430: \u0438\u0437 27 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u044c ASIN, \u0446\u0435\u043d\u0443, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a Prime.foreach (var row in new HtmlParser(html).FindAll(HtmlTag.Div, cls: &#171;s-result-item&#187;)){    var asin = row.AttributeByName(&#171;data-asin&#187;);    if (string.IsNullOrEmpty(asin)) continue;    var price = row.Find(HtmlTag.Span, cls: &#171;a-price&#187;);    var name = row.Find(HtmlTag.H2).Text();    var whole = price.Find(HtmlTag.Span, cls: &#171;a-price-whole&#187;).Text();     \/\/ null, \u0435\u0441\u043b\u0438 \u0446\u0435\u043d\u044b \u043d\u0435\u0442    var rating = row.Find(HtmlTag.I, cls: &#171;a-icon-star-mini&#187;)                    .Find(HtmlTag.Span, cls: &#171;a-icon-alt&#187;).Text();          \/\/ &#171;4.2 out of 5 stars&#187;    \/\/ &#8230;}Amazon, 1 \u041c\u0411z3l.FastHtmlParserHtmlAgilityPackAngleSharp\u0420\u0430\u0437\u0431\u043e\u04400,72 \u043c\u044112,3 \u043c\u044116,3 \u043c\u0441\u0420\u0430\u0437\u0431\u043e\u0440 + 27   \u0442\u043e\u0432\u0430\u0440\u043e\u04320,90 \u043c\u044118,0 \u043c\u044119,8 \u043c\u0441\u041f\u0430\u043c\u044f\u0442\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 23\u201329 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442 \u0438\u0437-\u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0430\u0432, \u043d\u043e \u0441\u0430\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 (LocalScrapeBenchmarks): \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 HTML \u0432\u044b\u0434\u0430\u0447\u0438 \u0432 benchmarks\/local\/amazon*.html \u0438 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e1. \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0433\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e DOM\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 List&lt;ParserTag&gt; \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b:public class ParserTag{    public int Start { get; }        \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f &#8216;&lt;&#8216;    public int End { get; }          \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e &#8216;&gt;&#8217;    public int InnerStart { get; }   \/\/ \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u0433\u0430    public int InnerEnd { get; }     \/\/ \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0433\u043e\u043c    public int Depth { get; }    \/\/ &#8230;}\u0422\u0435\u043a\u0441\u0442, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 HTML \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e \u0441\u0440\u0435\u0437\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438, \u0434\u0435\u0442\u0438, \u0441\u043e\u0441\u0435\u0434\u0438) \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b: \u043f\u043e\u0442\u043e\u043c\u043a\u0438 \u0442\u0435\u0433\u0430 \u0438\u0434\u0443\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043d\u0438\u043c, \u043f\u043e\u043a\u0430 \u0438\u0445 End \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0435\u0433\u043e End.2. \u041f\u0430\u043c\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0440\u043e\u0432\u043d\u043e \u043f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0433 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u0430 &lt;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 pagesource.Count(&#8216;&lt;&#8216;) \u0434\u0430\u0451\u0442 \u043d\u0430\u0434\u0451\u0436\u043d\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0438\u0441\u043b\u0430 \u0442\u0435\u0433\u043e\u0432. \u0420\u0430\u0437\u0431\u043e\u0440 \u0438\u0434\u0451\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u0437 ArrayPool, \u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430:int maxTags = pagesource.Count(&#8216;&lt;&#8216;);ParserTag[] tags = ArrayPool&lt;ParserTag&gt;.Shared.Rent(maxTags);TagState[] states = ArrayPool&lt;TagState&gt;.Shared.Rent(maxTags);\/\/ &#8230; \u0440\u0430\u0437\u0431\u043e\u0440 &#8230;var result = new List&lt;ParserTag&gt;(count);CollectionsMarshal.SetCount(result, count);tags.AsSpan(0, count).CopyTo(CollectionsMarshal.AsSpan(result));\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0434\u0432\u043e\u0435\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440\u0430 List&lt;T&gt; \u043f\u043e \u043c\u0435\u0440\u0435 \u0447\u0442\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0432 \u043f\u0443\u043b \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0447\u0438\u0449\u0430\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.3. \u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0412\u043d\u0435 \u0442\u0435\u0433\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u0432\u043e\u043b &lt;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043d\u0435\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 IndexOf. \u0412\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0433\u0430 \u0432\u0430\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e &lt;, = \u0438 &gt;, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d IndexOfAny. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0440\u043e\u0434\u0435 data-x=&#187;&lt;p&gt;&#8230;&lt;\/p&gt;&#187; \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u043b\u043e\u043c\u0430\u044e\u0442.\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 script, style, textarea, title \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c HTML5 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u044b\u0440\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0430 \u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u043e\u0439. \u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e &lt;\/script \u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0433\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u0431\u0435\u0437 \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439.4. \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u0433\u0438 \u0431\u0435\u0437 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0433 \u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0430\u0437\u0430\u0434 \u043f\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u041e(n2). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 ParserTag \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u0437 \u043f\u0443\u043b\u0430, \u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0442\u0435\u0433\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:private struct TagState{    public int Key;      \/\/ (int)HtmlTag \u0438\u043b\u0438 -1 \u0434\u043b\u044f \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438    public int Depth;    public bool Open;    public int PrevOpen; \/\/ \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0442\u0435\u0433\u043e\u0432    public int NextOpen;\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432. \u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u0443\u0437\u0435\u043b \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430 O(1). \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0434\u0443\u0442 \u043f\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c, \u0430 \u043d\u0435 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c.5. \u0418\u043c\u0435\u043d\u0430 \u0442\u0435\u0433\u043e\u0432 \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u043e\u043a\u0418\u043c\u044f \u0442\u0435\u0433\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u2014 \u044d\u0442\u043e ReadOnlySpan&lt;char&gt;. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b, \u043f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Dictionary&lt;string, HtmlTag&gt;.AlternateLookup&lt;ReadOnlySpan&lt;char&gt;&gt; \u0438\u0437 .NET 9. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c int.FrozenDictionary, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 \u0442\u0430\u043a\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043d\u0430 \u044d\u0442\u0438\u0445 \u0437\u0430\u043c\u0435\u0440\u0430\u0445 \u0443\u0441\u0442\u0443\u043f\u0438\u043b:\u25cf\u00a0\u00a0\u00a0\u00a0 \u0442\u0440\u0430\u0442\u0438\u043b \u043e\u043a\u043e\u043b\u043e 16 \u043c\u0441 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0432 JIT \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 Dictionary \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u0430 ~2 \u043c\u0441);\u25cf\u00a0\u00a0\u00a0\u00a0 \u043f\u043e\u0434 \u044d\u0442\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 30% \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435.\u041e\u0441\u0442\u0430\u043b\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Dictionary \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u043e\u043c:\/\/ \u0425\u0435\u0448: \u0434\u043b\u0438\u043d\u0430 \u0438 \u0442\u0440\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0430 \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435private static int Hash(ReadOnlySpan&lt;char&gt; s){    if (s.IsEmpty) return 0;    return (int)(((uint)s.Length &lt;&lt; 16) ^ (Upper(s[0]) &lt;&lt; 8) ^ Upper(s[^1]) ^ (Upper(s[s.Length &gt;&gt; 1]) &lt;&lt; 21));\u0414\u043b\u044f ASCII \u0435\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0443\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 | 0x20. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 OrdinalIgnoreCase. \u0414\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 ASCII-\u0438\u043c\u0435\u043d \u0442\u0435\u0433\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0422\u043e\u0442 \u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b HTML-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 (\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0435\u0433\u0438, SVG) \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 stackalloc \u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.6. \u0417\u0430\u043f\u0440\u043e\u0441\u044b: \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0431\u0435\u0437 IEnumerable\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u2014 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432:doc.Find(HtmlTag.Div, id: &#171;contacts&#187;)   .Find(HtmlTag.A, cls: &#171;phone&#187;)   .NextSibling(HtmlTag.Span)   .Text();\u0412 DOM-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0448\u0430\u0433 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 IEnumerable (FirstOrDefault, Descendants, Where), \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043b\u044f\u043c\u0431\u0434 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b.\u0417\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u044b Find, Parent, Next \u0438 NextSibling \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0434\u0438\u043d ParserTag. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b for \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0441\u043f\u0438\u0441\u043a\u0430:public static ParserTag? Find(this ITagSearchable? scope, in TagQuery query){    if (scope == null) return null;    scope.GetScope(out var tags, out int first, out int end);    for (int i = first, count = tags.Count; i &lt; count; i++)    {        var tag = tags[i];        if (tag.End &gt; end) break;        if (query.Matches(tag)) return tag;    }        return null;}TagQuery \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 (in), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044f\u0441\u044c \u043d\u0430 \u0441\u0442\u0435\u043a\u0435. \u0412\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0448\u0435 \u0431\u0435\u0437 .Text() \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 0 \u0431\u0430\u0439\u0442 \u0432 \u043a\u0443\u0447\u0435 (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 GC.GetAllocatedBytesForCurrentThread()). \u0410\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0435 .Text() (32 \u0431\u0430\u0439\u0442\u0430). \u041b\u0435\u043d\u0438\u0432\u044b\u0439 IEnumerable \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443 FindAll \u0438 Children, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u0435\u043d.\u0426\u0435\u043f\u043e\u0447\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b \u043a null: \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 null \u0431\u0435\u0437 \u0432\u044b\u0431\u0440\u043e\u0441\u0430 NullReferenceException.\u0411\u0438\u0442\u044b\u0439 HTML \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438\u041d\u0430 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0445 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0432\u0441\u043a\u0440\u044b\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:&lt;ul&gt;&lt;li&gt;One&lt;li&gt;Two&lt;li&gt;Three&lt;\/ul&gt;Text() \u0443 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 &lt;li&gt; \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0441\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e. \u0422\u0430 \u0436\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b\u0430\u0441\u044c \u0441 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c\u0438 &lt;p&gt;, &lt;td&gt;, &lt;dt&gt;\/&lt;dd&gt;, &lt;option&gt;. \u041f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 HTML5 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b, \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.\u042f \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0442\u0440\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430:1.\u00a0\u00a0\u00a0 \u041f\u0440\u0430\u0432\u0438\u043b\u0430 HTML5 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435. \u041d\u043e\u0432\u044b\u0439 &lt;li&gt; \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 &lt;li&gt;, \u0431\u043b\u043e\u0447\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 &lt;p&gt;. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-502792","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/502792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=502792"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/502792\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=502792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=502792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=502792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}