На вебстранице показан код парсера в консоли. Хотелось бы научиться получать результат парсинга сайта в 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;
}
}
Благодарю.
Отвечаю подробно.
Вы пишете на 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(); //реальный сервис
Запускаем, проверяем...
Пример лежит здесь.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как подружить Gulp и его browser-sync с PHP? ЧТО НАДО ПОМЕНЯТЬ В gulpfilejs чтобы он обновлял страницу при изменении php
Узнать статус в интерфейсе ethernet определенного портаЧерез терминал в Mikrotik это возможно через команду interface ethernet monitor ether1, терминал выведет...