Как записать консольный код AngleSharp в форме?

101
30 апреля 2021, 08:00

На вебстранице показан код парсера в консоли. Хотелось бы научиться получать результат парсинга сайта в textbox формы. Однако, к сожалению, не удается это сделать самостоятельно. Предполагается, что контент классов в форме сохранится, как и в консоли… Возможно, кто подскажет, как вывести результат парсинга сайта в textbox формы.

Вот этот код и не работает. Подскажите, что не так?

private void FrmMain_Shown(object sender, EventArgs e)
{
    txtBoxAngleSharp.Text = "==AngleSharp==" + "\n";
    var parser = new Parser();
    var ress = parser.GetWiki().Result;
    txtBoxAngleSharp.Text = $"Заголовок статьи: {ress.Header}" + "\n";
   foreach (var itm in ress.Images)
    {
        txtBoxAngleSharp.Text = itm;
    }
    txtBoxAngleSharp.Text = (new string('=', 20))+ "\n";
   foreach (var item in ress.Paragraphs)
    {
        txtBoxAngleSharp.Text = item;
    }

}

Благодарю.

Answer 1

Отвечаю подробно.

Вы пишете на C#, потому мыслить нужно категориями классов и объектов. Начинайте с создания класса(ов) модели информации, с которой будет работать ваша программа, благо в примере, на который вы ссылаетесь, уже есть такой класс модели. Создайте в проекте папку Models и создайте в ней класс

class WikiInfo
{
    public string Header { get; set; }
    public List<string> Paragraphs { get; private set; }
    //ctor
    public WikiInfo()
    {
        Paragraphs = new List<string>();
    }
}

Далее нам нужен класс, который будет закачивать веб-страницу, парсить ее и отдавать ее нам в виде экземпляра класса модели. Начнем с абстракции. Создайте папку Services и добавьте туда файл интерфейса

interface IWebService
{
    Task<WikiInfo> GetWikiPage(string address);
}

Для того чтобы на следующ. шаге поработать с визуальным интерфейсом нашей программы, создадим тестовый класс нашего сервиса, который будет реализовывать IWebService.

class MockWebService : IWebService
{
    public Task<WikiInfo> GetWikiPage(string address)
    {
        //готовим результат
        var result = new WikiInfo();
        result.Header = "Не удалось загрузить данные по этому адресу.";
        //проверяем запрашиваемый адрес
        if(String.IsNullOrEmpty(address)) return Task.FromResult(result);
        //тестовый результат
        result.Header = "Тестовые данные";
        result.Paragraphs.Add("Тестовый параграф 1");
        result.Paragraphs.Add("Тестовый параграф 2");
        result.Paragraphs.Add("Тестовый параграф 3");
        //отдаем тестовый результат
        return Task.FromResult(result);
    }
}

Набросаем на форму лейблы и текстбоксы с кнопкой. И напишем такой код

public partial class Form1 : Form
{
    //экземляр сервиса
    IWebService _webService;
    public Form1()
    {
        InitializeComponent();
        //оформление формы
        this.Text = "Примерчик";
        this.StartPosition = FormStartPosition.CenterScreen;
        //инициализируем
        _webService = new MockWebService(); //тестовый вариант сервиса
        //привязываемся к событию нажатия на кнопку
        this._buttonGet.Click += ButtonGet_Click;
    }
    private async void ButtonGet_Click(object sender, EventArgs e)
    {
        //
        _textBoxHeader.Text = String.Empty;
        _textBoxParagraphs.Text = String.Empty;
        _buttonGet.Enabled = false;
        try
        {
            //получаем данные
            var wikiInfo = await _webService.GetWikiPageAsync(_textBoxAddress.Text);
            //отображаем данные
            _textBoxHeader.Text = wikiInfo.Header;
            if (wikiInfo.Paragraphs.Any())
            {
                var firstPara = true;
                foreach (var para in wikiInfo.Paragraphs)
                {
                    if (firstPara)
                    {
                        _textBoxParagraphs.Text = para;
                        firstPara = false;
                    }
                    else
                    {
                        _textBoxParagraphs.Text += Environment.NewLine + para;
                    }
                }
            }
        }
        finally
        {
            _buttonGet.Enabled = true;
        }
    }
}

Убедимся, что все работает как надо

Устанавливаем пакет

Пишем на сей раз реальный класс сервиса

class WikiWebService : IWebService
{
    public async Task<WikiInfo> GetWikiPageAsync(string address)
    {
        //готовим результат
        var result = new WikiInfo();
        result.Header = "Не удалось загрузить данные по этому адресу.";
        //проверяем запрашиваемый адрес
        if (String.IsNullOrEmpty(address)) return result;
        //конфигурация для загрузки
        var config = Configuration.Default.WithDefaultLoader();
        try
        {
            //асинхронно загружаем страницу
            var document = await BrowsingContext.New(config).OpenAsync(address);
            //--Заголовок
            var cellSelector = @"h1#section_0";
            var cell = document.QuerySelector(cellSelector);
            result.Header = cell.TextContent;
            //--Параграфы
            cellSelector = @"main#content p";
            var cells = document.QuerySelectorAll(cellSelector);
            var pars = cells.Select(m => m.TextContent);
            result.Paragraphs.AddRange(pars);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Ошибка загрузки данных: {ex.Message}");
        }
        return result;
    }
}

Подправляем строку в конструкторе формы

//инициализируем
//_webService = new MockWebService(); //тестовый вариант сервиса
_webService = new WikiWebService(); //реальный сервис

Запускаем, проверяем...

Пример лежит здесь.

READ ALSO
Как подружить Gulp и его browser-sync с PHP?

Как подружить Gulp и его browser-sync с PHP?

Как подружить Gulp и его browser-sync с PHP? ЧТО НАДО ПОМЕНЯТЬ В gulpfilejs чтобы он обновлял страницу при изменении php

197
Получить статус link в Mikrotik через api в php

Получить статус link в Mikrotik через api в php

Узнать статус в интерфейсе ethernet определенного портаЧерез терминал в Mikrotik это возможно через команду interface ethernet monitor ether1, терминал выведет...

78