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

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

7 ответов


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

запрет этого метода, глядя на сам файл, текстовые блоки сохраняются в файле как есть, а все остальное содержимое сохраняется в Base64. Каждому элементу контента предшествует:

[Boundary]
Content-Type: [Mime Type]
Content-Transfer-Encoding: [Encoding Type]
Content-Location: [Full path of content]

здесь [Mime Type], [Тип Шифрования] и [полный путь к содержимому] переменной. [Тип Шифрования] оказывается в 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 и MS Word, есть эта кросс-платформенная программа с открытым исходным кодом под названием "mht2html" на SourceForge.net:

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

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

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


MHT файл по существу MIME. Таким образом, можно использовать Chilkat.Mime или полностью бесплатная система.Сеть.Компоненты 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

Я думаю, что @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. The 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
                }

            }
        }
    }

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

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

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


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


Шаг 1 : Откройте .МГТ / .Файл MHTML в браузере.

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

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