首页 > 解决方案 > 如何开发最佳解析器方案?

问题描述

我使用 AngleSharp 编写了一个解析器。有条件地用于测试的解析站点。

代码

 public async void Parser()
        {
            // *** HtmlLoader ***
            HttpClient client = new HttpClient();
            string currentUrl = "https://github.com/search?q=winform&type=Repositories";
            var response = await client.GetAsync(currentUrl);
             string source = await response.Content.ReadAsStringAsync(); // результат парсинга 


            // HTML парсер, который доступен из "AngleSharp".
            var domParser = new HtmlParser();

            // Спарсим асинхронно наш исходный код и получим документ с которым мы можем работать
            var document = await domParser.ParseAsync(source);


            // *** Парсинг ***
            // var items = document.QuerySelectorAll("a").Where(item =>
            //         item.ClassName != null && item.ClassName.Contains("post__title_link"));

            var fieldNameCollect = document.QuerySelectorAll("div.col-12.col-md-8.pr-md-3 > h3");
            var fieldDescriptCollect = document.QuerySelectorAll("div.col-12.col-md-8.pr-md-3 > p");            
            var fieldUpdateCollect = document.QuerySelectorAll("div > p > relative-time");            
            var fieldLangCollect = document.QuerySelectorAll("div.text-gray.flex-auto.min-width-0"); 
            var fieldStarCollect = document.QuerySelectorAll("div.pl-2.pl-md-0.text-right.flex-auto.min-width-0 > a");


            // Колличество
            int count = fieldNameCollect.Length;

            // Перебор элементов
            for (int i = 0; i < count; i++)
            {
                string fieldName = fieldNameCollect[i].TextContent;
                string fieldDescript = fieldDescriptCollect[i].TextContent;                
                string fieldUpdate = fieldUpdateCollect[i].TextContent;
                string fieldLang =  fieldLangCollect[i].TextContent;
                string fieldStar = fieldStarCollect[i].TextContent;

                ConnectDBAccess connectDBAccess = new ConnectDBAccess(tableName, pathDB);

                connectDBAccess.InsertRecord(fieldName, fieldDescript, fieldUpdate, fieldLang, fieldStar);
            }

解析器的原理:
- 解析器获取每个字段的集合;
- 解析器按索引执行集合的集合;
- 解析器将数据输入数据库;

问题
1. 这样的解析器方案是否有缺点,如何使其更优化?

标签: c#

解决方案


推荐阅读