首页 > 解决方案 > 使用来自 html 的解析数据播种数据库

问题描述

  1. 我有一个带有静态方法的控制台应用程序,可以解析站点中的一些数据。

  2. 我有一个带有 1 个表的 Web API 项目数据库。

  3. 我需要用解析后的数据播种该表。

  4. 控制台应用程序和 Web API 项目都在同一个解决方案中。

使用 HtmlAgilityPack 进行解析。

做这个的最好方式是什么?我以为我可以在 Console App 项目中的静态方法中简单地访问数据库的上下文,然后简单地将其添加到 foreach 循环中,将每个元素一一添加,但这似乎是不可能的,或者抛出诸如“CS7036 C#有没有给出对应于所需形式参数的参数,或者对于这么简单的程序来说,它们似乎非常非常低效和过于复杂。我很确定有一种正确的方法可以做到这一点,但找不到任何方法。感谢您提前提供任何帮助。这是解析静态方法。

    class Parser
{
    public static void newsParser()
    {

        Console.OutputEncoding = Encoding.UTF8;


        //Putting the links in the variables
        var urlNews = @"https://tengrinews.kz/news/";

        var urlMain = @"https://tengrinews.kz";

        var htmlWeb = new HtmlWeb();

        var htmlDoc = htmlWeb.Load(urlNews);

        //Getting the links of the news articles
        var NewsLinksNode = htmlDoc.DocumentNode.SelectNodes("//*[@class='tn-link']");


        //Creating a list and putting all the parsed links into it.
        List<string> listOfLinks = new List<string>();

        foreach (var links in NewsLinksNode)
        {
            var newsLinks = urlMain + links.GetAttributeValue("href", null);

            List<string> listOfLinks1 = newsLinks.Split(new char[] { ',' }).ToList();

            listOfLinks.AddRange(listOfLinks1);
        }


        //Iterating through the list of links
        foreach (var newsInfo in listOfLinks)
        {
            var htmlNews = htmlWeb.Load(newsInfo);

            var newsTitle = htmlNews.DocumentNode.SelectNodes(".//h1[@class='tn-content-title']/text()");
            //Getting the titles
            foreach (var Titles in newsTitle)
            {
                Console.WriteLine(Titles.InnerText.Trim());
            }

            var newsDate = htmlNews.DocumentNode.SelectNodes(".//h1[@class='tn-content-title']//span[@class='tn-hidden']");
            //Getting the dates
            foreach (var Dates in newsDate)
            {
                Console.WriteLine(Dates.InnerText.Trim());
            }

            var newsText = htmlNews.DocumentNode.SelectNodes(".//article[@class='tn-news-text']/*[position() != last() and position() != last() - 1]");
            //Getting the texts
            foreach (var Text in newsText)
            {
                Console.WriteLine(Text.InnerText.Trim());
            }

            var newsTheme = htmlNews.DocumentNode.SelectNodes(".//ol[@class='tn-bread-crumbs']/*[last()]");
            //Getting themes
            foreach (var Theme in newsTheme)
            {
                Console.WriteLine(Theme.InnerText.ToString().Trim());
            }

        }
    }
}

标签: c#entity-frameworkparsing

解决方案


推荐阅读