Многие инструменты имеют способ экспортировать файл .MHT. Я хочу, чтобы преобразовать этот единственный файл в коллекцию файлов, HTML-файл, соответствующие изображения и файлы CSS, которые я мог затем загрузить на веб-хост и расходуть для всех браузеров. Кто-нибудь знает какие-либо инструменты или библиотеки или алгоритмы для этого.Как программно (или с помощью инструмента) конвертировать файлы .MHT mhtml в обычные HTML и CSS-файлы?
ответ
Ну, вы можете открыть файл .MHT в IE и сохранить его как веб-страницу. Я протестировал это на этой странице, и хотя в IE он выглядел странно (это IE в конце концов), он сохранил, а затем открылся в Chrome (как и в случае с ним).
Запрет на этот метод, если смотреть на сам файл, текстовые блоки сохраняются в файле как есть, а весь другой контент сохраняется в Base64. Каждый элемент содержания предшествует:
[Boundary]
Content-Type: [Mime Type]
Content-Transfer-Encoding: [Encoding Type]
Content-Location: [Full path of content]
Где [Тип Mime], [Тип кодирования] и [Полный путь к содержанию] являются переменными. [Тип кодирования] представляется либо base64, либо quoted-printable. [Граница] определяется в начале файла .MHT так:
From: <Saved by WebKit>
Subject: converter - How can you programmatically (or with a tool) convert .MHT mhtml files to regular HTML and CSS files? - Stack Overflow
Date: Fri, 9 May 2013 13:53:36 -0400
MIME-Version: 1.0
Content-Type: multipart/related;
type="text/html";
boundary="----=_NextPart_000_0C08_58653ABB.B67612B7"
С помощью этого, вы можете сделать свой собственный файл анализатор, если это необходимо.
, поэтому IE затем создаст папку и сохранит изображения отдельно и т. Д.? Интересно, можете ли вы автоматизировать IE, чтобы сделать это с COM-объектом? – klumsy
Да, IE создает папку со всеми изображениями и еще много чего. Объект COM показывает функцию «Навигация» и обработчики событий (для завершения и т. Д.), Но я не смог найти функцию сохранения в ее ссылке. Не значит, что его там нет, просто я не смог его найти. – XGundam05
Я играл с этим больше, и я могу загрузить его, и сохранить его взломать автоматизировать нажатие клавиши «Сохранить как», что является взломанным и хрупким. однако он хочет сохранить его как MHT, а не полный HTML (сохранение сайта в сети как полноценного сайта отлично работает), и я не могу найти способ для конкретного, который сохраняется как опция с помощью ExecWB, поэтому, вероятно, лучше всего сделать просто работайте над обработкой MHT с помощью кода или попробуйте другой вид автоматизации с селеном, автоматизацией или расширением forefox или chrome или что-то в этом роде. – klumsy
Я считаю, что @ XGundam05 верен. Вот что я сделал, чтобы заставить его работать.
Я начал с проекта Windows Form в Visual Studio. Добавил WebBrowser в форму и добавил две кнопки. Затем этот код:
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.ShowSaveAsDialog();
}
private void button2_Click(object sender, EventArgs e)
{
webBrowser1.Url = new Uri("localfile.mht");
}
Вы должны быть в состоянии принять этот код и добавить в список файлов и обработать каждый из них с foreach
. webBrowser
содержит метод, называемый ShowSaveAsDialog()
; И это позволит сохранить как .mht или только html или полную страницу.
EDIT: вы можете использовать документ WebBrowser и очистить информацию на этом этапе. Добавляя RichTextBox и публичную переменную как в MS здесь: http://msdn.microsoft.com/en-us/library/ms171713.aspx
public string Code
{
get
{
if (richTextBox1.Text != null)
{
return (richTextBox1.Text);
}
else
{
return ("");
}
}
set
{
richTextBox1.Text = value;
}
}
private void button2_Click(object sender, EventArgs e)
{
webBrowser1.Url = new Uri("localfile.mht");
HtmlElement elem;
if (webBrowser1.Document != null)
{
HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("HTML");
if (elems.Count == 1)
{
elem = elems[0];
Code = elem.OuterHtml;
foreach (HtmlElement elem1 in elems)
{
//look for pictures to save
}
}
}
}
для ваших ребяческих решений, и это http://stackoverflow.com/questions/872750/saving-a- web-page-from-ie-using-powershell Кажется, это не представляется возможным, если не появится диалог saveas. Я надеялся, что смогу автоматизировать эту enmasse. – klumsy
С редактированием вы можете придумать процесс очистки и сохранения HTML и изображений. – CaptainBli
Так автоматизации IE было трудно и не могут быть использованы конца до конца, так что я думаю, построение какой-то код, который делает это будет путь , на GitHub я нашел этот питона один, который может быть хорошим
https://github.com/Modified/MHTifier http://decodecode.net/elitist/2013/01/mhtifier/
Если у меня есть время я буду стараться сделать что-то подобное в PowerShell.
Кроме IE и MS Word, есть это с открытым исходным кодом программы кросс-платформенный называется 'mht2html' над на SourceForge.net:
http://sourceforge.net/projects/mht2htm/.
Я еще не протестировал его, но, похоже, получил хорошие отзывы.
P.С. Извините за предоставление ответа на такой старый вопрос.
MHT файл по существу MIME. Таким образом, можно использовать Chilkat.Mime или полностью свободные компоненты System.Net.Mime для доступа к своей внутренней структуре. Если, например, MHT содержит изображения, их можно заменить на строки base64 в выходном HTML.
Imports HtmlAgilityPack
Imports Fizzler.Systems.HtmlAgilityPack
Imports Chilkat
Public Function ConvertMhtToHtml(ByVal mhtFile As String) As String
Dim chilkatWholeMime As New Chilkat.Mime
'Load mime'
chilkatWholeMime.LoadMimeFile(mhtFile)
'Get html string, which is 1-st part of mime'
Dim html As String = chilkatWholeMime.GetPart(0).GetBodyDecoded
'Create collection for storing url of images and theirs base64 representations'
Dim allImages As New Specialized.NameValueCollection
'Iterate through mime parts'
For i = 1 To chilkatWholeMime.NumParts - 1
Dim m As Chilkat.Mime = chilkatWholeMime.GetPart(i)
'See if it is image'
If m.IsImage AndAlso m.Encoding = "base64" Then
allImages.Add(m.GetHeaderField("Content-Location"), "data:" + m.ContentType + ";base64," + m.GetBodyEncoded)
End If : m.Dispose()
Next : chilkatWholeMime.Dispose()
'Now it is time to replace the source attribute of all images in HTML with dataURI'
Dim htmlDoc As New HtmlDocument : htmlDoc.LoadHtml(html) : Dim docNode As HtmlNode = htmlDoc.DocumentNode
For i = 0 To allImages.Count - 1
'Select all images, whose src attribute is equal to saved URL'
Dim keyURL As String = allImages.GetKey(i) 'Saved url from MHT'
Dim elementsWithPics() As HtmlNode = docNode.QuerySelectorAll("img[src='" + keyURL + "']").ToArray
Dim imgsrc As String = allImages.GetValues(i)(0) 'dataURI as base64 string'
For j = 0 To elementsWithPics.Length - 1
elementsWithPics(j).SetAttributeValue("src", imgsrc)
Next
'Select all elements, whose style attribute contains saved URL'
elementsWithPics = docNode.QuerySelectorAll("[style~='" + keyURL + "']").ToArray
For j = 0 To elementsWithPics.Length - 1
'Get and modify style'
Dim modStyle As String = Strings.Replace(elementsWithPics(j).GetAttributeValue("style", String.Empty), keyURL, imgsrc, 1, 1, 1)
elementsWithPics(j).SetAttributeValue("style", modStyle)
Next : Erase elementsWithPics
Next
'Get final html'
Dim tw As New StringWriter()
htmlDoc.Save(tw) : html = tw.ToString : tw.Close() : tw.Dispose()
Return html
End Function
Какой язык программирования? –
Это VB.Net. Он использует пакет с открытым исходным кодом «Fizzler.Systems.HtmlAgilityPack» и коммерческий пакет «Chilkat.Mime». Но Chilkat можно заменить классом System.Net.Mime. – Zagavarr
Firefox имеет встроенный инструмент. Перейдите в меню (нажмите Alt, если скрыто) File->Convert saved pages
.
Шаг 1: Откройте файл .MHT/.MHTML в браузере.
Шаг 2: Щелкните правой кнопкой мыши, чтобы выбрать, чтобы посмотреть исходный код.
Шаг 3: Скопируйте исходный код и вставьте его в новый .TXT-файл, затем измените расширение файла на .HTML.
Какой язык программирования вы намерены использовать? –