Распарсить веб-архив .MHTML и осуществить в нем поиск - C#
Формулировка задачи:
Добрый день всем!
Есть необходимость в файлах *.mhtml (веб-архивах) осуществлять поиск текста. Файлы могут быть достаточно большого размера, 5-10-50 Мб и более.
Я пытался, для начала, прочитать файл в string - не проходит, читает первые ~100 Кб а дальше как обрезает.
Решил "выйти из положения" с помощью WebBrowser. Примерный код:
Но не прокатило - wb.DocumentText -> null
Дальше пытался через DOM обратиться к контенту, тоже бес толку, везде либо null, либо пустая строка. Единственное, что оказалось полезным - wb.DocumentStream - там данные, вроде как, есть.
Попытался в string "перелить" - та же беда с размером - ~100 Кб и все.
Попытался в временный текстовый файл сохранить, размер файла те же ~100 Кб и внутри только часть "честного" html'я.
А исходный тестовый .mhtml размером 2,45 Мб.
При этом когда исходный веб-архив открываю в "честном" ИЕ, то он открывается полностью, поиск в нем (штатный ИЕ-шный, понятное дело) работает, что нужно находит, и при нажатии "Сохранить как" (с выбором "честного" .html) получается файл размером 1,78 Мб.
В общем, что называется, зашел в тупик. Подскажите, плиз, в какую сторону копать? Поиск не помог, к сожалению...
WebBrowser wb = new WebBrowser();
wb.Navigate(sFileName);
sFileContent_ = wb.DocumentText; sTMPFile = Path.GetTempFileName();
WebBrowser wb = new WebBrowser();
wb.Navigate(sFileName);
wb.Refresh(WebBrowserRefreshOption.Normal);
byte[] bData = new byte[wb.DocumentStream.Length]; // wb.DocumentStream.Length = 207400
wb.DocumentStream.Read(bData, 0, bData.Length);
sFileContent_ = System.Text.Encoding.Default.GetString(bData); // в отладчике (Shift+F9) - Элемент "sFileContent_" не существует в текущем контексте.
File.WriteAllBytes(sTMPFile, bData); // после выполнения размер файла 100 КбРешение задачи: «Распарсить веб-архив .MHTML и осуществить в нем поиск»
textual
Листинг программы
using (var fstream = File.OpenRead("webpage.mht"))
{
var message = MimeMessage.Load(fstream);
foreach (var textPart in message.BodyParts.OfType<TextPart>().Where(tp => tp.IsHtml))
{
string html = textPart.Text;
// ...
}
}