TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.7K subscribers
Post #6796 3.23K
📎 Парсим HTML в C#

FreeSpire.Doc для .NET — профессиональная библиотека для обработки документов. Она позволяет разработчикам на C# читать, анализировать и извлекать HTML-контент с минимальным количеством кода и без внешних зависимостей.

Установка через NuGet:
Install-Package FreeSpire.Doc


Необходимые неймспейсы:
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;
using System.IO;
using System.Text.RegularExpressions;


Кейс 1. Извлечение текста из HTML-строки

Библиотека справляется с обработкой динамически генерируемых HTML-фрагментов, например, контента из фронтенд-редакторов или HTML-строк, возвращаемых API.

string htmlContent = @"
<html>
<body>
<h2>Описание возможностей продукта</h2>
<p>Этот компонент поддерживает<span style='font-size:14px;'> парсинг HTML</span> и имеет следующие преимущества:</p>
<ul>
<li>Кроссплатформенная совместимость .NET</li>
<li>Не зависит от Office</li>
<li>Быстрое извлечение текста</li>
</ul>
</body>
</html>
";

Document parseDoc = new Document();
Section section = parseDoc.AddSection();
Paragraph paragraph = section.AddParagraph();

try
{
// Ключевой метод: загрузка и парсинг HTML
paragraph.AppendHTML(htmlContent);

// Извлечение чистого текста
string pureText = parseDoc.GetText();

// Очистка текста от лишних пробелов
pureText = Regex.Replace(pureText, @"\s+", " ").Trim();

Console.WriteLine("Извлечённый текст:");
Console.WriteLine(pureText);
}
finally
{
parseDoc.Dispose();
}


Кейс 2. Извлечение структурированного контента из файла

При работе с локально сохранёнными HTML-файлами чаще нужно извлечь конкретные структурированные данные: заголовки, списки, гиперссылки.

string htmlFilePath = "sample.html";

Document parseDoc = new Document();
parseDoc.LoadFromFile(htmlFilePath);

// Извлечение заголовков (h1-h6)
foreach (Section sec in parseDoc.Sections)
{
foreach (Paragraph para in sec.Paragraphs)
{
if (para.GetStyle().Name.StartsWith("Heading"))
{
Console.WriteLine(para.Text.Trim());
}
}
}

// Извлечение элементов списков
foreach (Section sec in parseDoc.Sections)
{
foreach (Paragraph para in sec.Paragraphs)
{
if (para.ListFormat.ListType != ListType.NoList)
{
Console.WriteLine(para.Text.Trim());
}
}
}

// Извлечение гиперссылок
foreach (Section sec in parseDoc.Sections)
{
foreach (Paragraph para in sec.Paragraphs)
{
foreach (DocumentObject docObj in para.ChildObjects)
{
if (docObj is Field field && field.Type == FieldType.FieldHyperlink)
{
string linkText = field.FieldText;
string linkUrl = field.GetFieldCode().Split('"')[1];
Console.WriteLine($"Текст: {linkText}, URL: {linkUrl}");
}
}
}
}


Лучшие практики:

• Всегда оборачивайте Document в using или вызывайте Dispose() для освобождения ресурсов

• Проверяйте существование файлов и обрабатывайте исключения парсинга

• Обрабатывайте извлечённый текст с помощью Regex.Replace для нормализации пробелов

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека шарписта

#sharp_view
  • 👍 7
  • ❤‍🔥 6
More from @csharpproglib
  1. Sep 26, 2026📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #garbage_collector
  2. Sep 25, 2026🔐 NuGet: Microsoft меняет сертификат подписи С 23 сентября Microsoft использует новый сер…
  3. Sep 24, 2026🤩 Как поймать зависший .NET-сервис Приложение начинает тормозить, запросы зависают, а в л…
  4. Sep 23, 2026⚙️ yield return не бесплатный Итераторы выглядят просто, но работают иначе: IEnumerable<in…
  5. Sep 22, 2026💡 Replace, Regex или StringBuilder? Для замены текста в C# есть несколько инструментов. И…
  6. Sep 21, 2026⚙️ Настоящие атомарные операции Если Volatile решает проблему видимости, то Interlocked ре…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →