🧪 Практикум: парсинг диалогов DeepSeek с помощью C# и регулярных выражений
C# Regex Парсинг DeepSeek
📌 Шаг 1. Сохраняем диалог с DeepSeek
Чтобы получить данные для парсинга, нам нужно сохранить страницу с диалогом в формате HTML.
Инструкция:
- Откройте chat.deepseek.com в браузере.
- Авторизуйтесь и откройте нужный диалог.
- Нажмите Ctrl + S (или Cmd + S на Mac).
- Выберите тип сохранения: «Веб-страница полностью» (HTML + файлы) или «Веб-страница, только HTML».
- Назовите файл
deepseek_chat.htmlи сохраните в удобную папку.
Прокрутите страницу вниз до конца диалога, чтобы все сообщения загрузились, и только потом сохраняйте.
📌 Шаг 2. Анализируем структуру HTML
Откройте сохранённый файл deepseek_chat.html в любом редакторе кода (VS Code, Notepad++, даже в Блокноте).
Найдите блоки сообщений. В DeepSeek они обычно выглядят так:
<div class="message-text">Привет, DeepSeek!</div>
</div>
<div class="chat-message assistant">
<div class="message-text">Здравствуйте! Чем могу помочь?</div>
</div>
Ключевые элементы для регулярного выражения:
- Класс контейнера:
chat-message userилиchat-message assistant - Класс текста:
message-text - Роль (user/assistant): будет использоваться для идентификации отправителя
📌 Шаг 3. Пишем регулярное выражение для парсинга
Нам нужно извлечь две вещи: роль (user или assistant) и текст сообщения.
string pattern = @"<div class=""chat-message\s+(?<role>user|assistant)"">\s*<div class=""message-text"">(?<text>.*?)</div>";
Разбор паттерна:
| Часть шаблона | Что означает |
|---|---|
<div class=""chat-message\s+ | Открывающий тег с классом chat-message и пробелом |
(?<role>user|assistant) | Именованная группа role — user или assistant |
>\s*<div class=""message-text""> | Закрывающий тег и открывающий тег текста |
(?<text>.*?) | Именованная группа text — текст сообщения (ленивый захват) |
</div> | Закрывающий тег текста |
RegexOptions.Singleline, чтобы точка (.) учитывала переводы строк. И RegexOptions.Compiled для производительности.
📌 Шаг 4. Пишем полный код на C#
Создайте новое консольное приложение в Visual Studio или VS Code. Вставьте следующий код:
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO;
class DeepSeekParser
{
// Регулярное выражение для парсинга сообщений
private static readonly Regex MessageRegex = new Regex(
@"<div class=""chat-message\s+(?<role>user|assistant)"">\s*<div class=""message-text"">(?<text>.*?)</div>",
RegexOptions.Singleline | RegexOptions.Compiled
);
public static List<ChatMessage> ParseFromHtml(string html)
{
var messages = new List<ChatMessage>();
var matches = MessageRegex.Matches(html);
foreach (Match match in matches)
{
string role = match.Groups["role"].Value;
string text = match.Groups["text"].Value;
// Декодируем HTML-сущности
text = text
.Replace("<", "<")
.Replace(">", ">")
.Replace("&", "&")
.Replace(""", "\"");
messages.Add(new ChatMessage
{
Role = role == "user" ? MessageRole.User : MessageRole.Assistant,
Text = text
});
}
return messages;
}
public static void SaveToFile(List<ChatMessage> messages, string filePath)
{
using (var writer = new StreamWriter(filePath))
{
foreach (var msg in messages)
{
writer.WriteLine($"[{msg.Role}] {msg.Text}");
writer.WriteLine(new string('-', 50));
}
}
}
}
public class ChatMessage
{
public MessageRole Role { get; set; }
public string Text { get; set; }
}
public enum MessageRole { User, Assistant }
class Program
{
static void Main()
{
// Укажите путь к сохранённому HTML-файлу
string html = File.ReadAllText("deepseek_chat.html");
var messages = DeepSeekParser.ParseFromHtml(html);
// Выводим в консоль
foreach (var msg in messages)
{
Console.WriteLine($"{msg.Role}: {msg.Text}");
}
// Сохраняем в файл
DeepSeekParser.SaveToFile(messages, "chat_output.txt");
Console.WriteLine($"\n✅ Сообщений распаршено: {messages.Count}");
}
}
📌 Шаг 5. Запускаем и проверяем
Порядок действий:
- Положите
deepseek_chat.htmlв ту же папку, где находитсяProgram.cs. - Запустите программу (F5 в Visual Studio или
dotnet run). - В консоли увидите список сообщений с ролями
UserиAssistant. - В папке появится файл
chat_output.txtс тем же содержимым.
📌 Шаг 6. Задания для самостоятельной работы
🔹 Задание 1. Извлечение ссылок из сообщений
Добавьте в программу дополнительный парсинг: найдите все URL-ссылки (http:// или https://) внутри текста сообщений и выведите их отдельно.
string urlPattern = @"https?://[^\s/$.?#].[^\s]*";
🔹 Задание 2. Подсчёт статистики
Посчитайте и выведите в консоль:
- Общее количество сообщений
- Количество сообщений от пользователя
- Количество сообщений от ассистента
- Среднюю длину сообщения (в символах)
🔹 Задание 3. Обработка пустых сообщений
В диалогах могут встречаться пустые или служебные сообщения. Добавьте проверку: если текст сообщения пустой или содержит только пробелы — не добавлять его в результат.
📌 Шаг 7. Возможные проблемы и их решение
| Проблема | Решение |
|---|---|
Файл deepseek_chat.html не найден |
Укажите полный путь к файлу или переместите файл в папку с проектом |
| Regex не находит сообщения | Откройте HTML и убедитесь, что классы совпадают. Если DeepSeek изменил структуру — поправьте регулярное выражение |
Текст содержит странные символы (<, >) |
Убедитесь, что вы добавили замену HTML-сущностей (код в шаге 4) |
| Сообщения отображаются в неправильном порядке | Проверьте, что в HTML они идут в том же порядке, что и в диалоге. Regex сохраняет порядок. |
📌 Итоги практикума
Вы научились:
- ✅ Сохранять веб-страницу с диалогом в HTML
- ✅ Анализировать структуру HTML и составлять регулярное выражение
- ✅ Использовать именованные группы (
(?<role>...)) - ✅ Парсить и очищать текст с помощью C#
- ✅ Сохранять результат в текстовый файл
Попробуйте применить этот же подход для парсинга других сайтов: извлечения цен с маркетплейсов, новостей, комментариев — везде, где есть структурированный HTML.
📚 Больше материалов по C# и парсингу — на gadget59.ru