Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Где [Тип Mime], [Тип кодирования] и [Полный путь к контенту] являются переменными. [Тип кодирования] отображается как base64, так и с кавычками. [Граница] определяется в начале файла .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"

Используя это, вы можете сделать свой собственный парсер файлов, если это необходимо.

Ответ 2

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

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

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

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

Ответ 3

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

            }
        }
    }

Ответ 4

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

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

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

Ответ 5

Файл 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

Ответ 6

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

Ответ 7

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

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

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