2013-04-24 3 views
13

Многие инструменты имеют способ экспортировать файл .MHT. Я хочу, чтобы преобразовать этот единственный файл в коллекцию файлов, HTML-файл, соответствующие изображения и файлы CSS, которые я мог затем загрузить на веб-хост и расходуть для всех браузеров. Кто-нибудь знает какие-либо инструменты или библиотеки или алгоритмы для этого.Как программно (или с помощью инструмента) конвертировать файлы .MHT mhtml в обычные HTML и CSS-файлы?

+0

Какой язык программирования вы намерены использовать? –

ответ

10

Ну, вы можете открыть файл .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" 

С помощью этого, вы можете сделать свой собственный файл анализатор, если это необходимо.

+0

, поэтому IE затем создаст папку и сохранит изображения отдельно и т. Д.? Интересно, можете ли вы автоматизировать IE, чтобы сделать это с COM-объектом? – klumsy

+0

Да, IE создает папку со всеми изображениями и еще много чего. Объект COM показывает функцию «Навигация» и обработчики событий (для завершения и т. Д.), Но я не смог найти функцию сохранения в ее ссылке. Не значит, что его там нет, просто я не смог его найти. – XGundam05

+0

Я играл с этим больше, и я могу загрузить его, и сохранить его взломать автоматизировать нажатие клавиши «Сохранить как», что является взломанным и хрупким. однако он хочет сохранить его как MHT, а не полный HTML (сохранение сайта в сети как полноценного сайта отлично работает), и я не могу найти способ для конкретного, который сохраняется как опция с помощью ExecWB, поэтому, вероятно, лучше всего сделать просто работайте над обработкой MHT с помощью кода или попробуйте другой вид автоматизации с селеном, автоматизацией или расширением forefox или chrome или что-то в этом роде. – klumsy

0

Я считаю, что @ 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 
       } 

      } 
     } 
    } 
+0

для ваших ребяческих решений, и это http://stackoverflow.com/questions/872750/saving-a- web-page-from-ie-using-powershell Кажется, это не представляется возможным, если не появится диалог saveas. Я надеялся, что смогу автоматизировать эту enmasse. – klumsy

+0

С редактированием вы можете придумать процесс очистки и сохранения HTML и изображений. – CaptainBli

0

Так автоматизации IE было трудно и не могут быть использованы конца до конца, так что я думаю, построение какой-то код, который делает это будет путь , на GitHub я нашел этот питона один, который может быть хорошим

https://github.com/Modified/MHTifier http://decodecode.net/elitist/2013/01/mhtifier/

Если у меня есть время я буду стараться сделать что-то подобное в PowerShell.

1

Кроме IE и MS Word, есть это с открытым исходным кодом программы кросс-платформенный называется 'mht2html' над на SourceForge.net:

http://sourceforge.net/projects/mht2htm/.

Я еще не протестировал его, но, похоже, получил хорошие отзывы.

P.С. Извините за предоставление ответа на такой старый вопрос.

0

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 
+0

Какой язык программирования? –

+1

Это VB.Net. Он использует пакет с открытым исходным кодом «Fizzler.Systems.HtmlAgilityPack» и коммерческий пакет «Chilkat.Mime». Но Chilkat можно заменить классом System.Net.Mime. – Zagavarr

-1

Firefox имеет встроенный инструмент. Перейдите в меню (нажмите Alt, если скрыто) File->Convert saved pages.

-1

Шаг 1: Откройте файл .MHT/.MHTML в браузере.

Шаг 2: Щелкните правой кнопкой мыши, чтобы выбрать, чтобы посмотреть исходный код.

Шаг 3: Скопируйте исходный код и вставьте его в новый .TXT-файл, затем измените расширение файла на .HTML.