-1

На вебстранице показан код парсера в консоли. Хотелось бы научиться получать результат парсинга сайта в 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;
    }


}

Благодарю.

Victor
  • 1
  • Заменяете Console.WriteLine(value); на textBox.Text = value;. Всё. – Alexander Petrov Jul 28 '19 at 19:35
  • Alexander, а конкретнее можно, исходя из контекста консольного кода, указанного в ссылке. Спасибо. – Victor Victor Jul 28 '19 at 19:53
  • Вам скинули прямо код, что на что заменить, куда уже конкретнее. Создаете форму, копируете туда ваш код в отдельный метод, добавляете на форму кнопку и текстбокс. При нажатии на кнопку указываете свой метод, только вместо консоли пишете в текстбокс. – tym32167 Jul 28 '19 at 20:25
  • @tym32167, я уже ранее неоднократно проделал указанную Вами схему, да и те элементарные действия, на которые указал Alexander, мне также знакомы… Однако, без положительного результата… С одним лишь исключением, я запускаю код через событие Form.Shown, а не через кнопку…)) – Victor Victor Jul 29 '19 at 16:13
  • ну так вы покажите ваши попытки, добавьте ваш код в вопрос, опишите что именно не работает – tym32167 Jul 29 '19 at 16:35
  • Может вам надо заменить txtBoxAngleSharp.Text = item; на txtBoxAngleSharp.Text += item; ? – tym32167 Jul 29 '19 at 18:16

1 Answers1

0

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

Вы пишете на 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(); //реальный сервис

Запускаем, проверяем... окончательный пример работы программы

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

Bulson
  • 9,411