Распарсить веб-архив .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;
- // ...
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д