23

许多工具都有导出 .MHT 文件的方法。我想要一种将单个文件转换为文件集合、HTML 文件、相关图像和 CSS 文件的方法,然后我可以将其上传到网络主机并可供所有浏览器使用。有没有人知道任何工具或库或算法来做到这一点。

4

7 回答 7

15

好吧,您可以在 IE 中打开 .MHT 文件,然后将其另存为网页。我用这个页面对此进行了测试,尽管它在 IE 中看起来很奇怪(毕竟它是 IE),但它保存并在 Chrome 中正常打开(就像它看起来应该的那样)。

除了这种方法,查看文件本身,文本块按原样保存在文件中,所有其他内容都保存在 Base64 中。每项内容前面都有:

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

其中[Mime Type][Encoding Type][Full path of content]是可变的。[编码类型]似乎是base64quoted-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"

使用它,您可以根据需要制作自己的文件解析器。

于 2013-05-09T18:13:17.643 回答
4

除了 IE 和 MS Word,还有一个名为“mht2html”的开源跨平台程序,首次编写于2007 年,最后一次更新于2016 年。它同时具有 GUI 和终端界面。

我还没有测试它,但它似乎收到了很好的评价。

于 2015-08-28T16:48:14.943 回答
3

MHT 文件本质上是 MIME。因此,可以使用 Chilkat.Mime 或完全免费的 System.Net.Mime 组件来访问其内部结构。例如,如果 MHT 包含图像,则可以在输出 HTML 中将它们替换为 base64 字符串。

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
于 2016-06-14T05:33:46.530 回答
1

我认为@XGundam05 是正确的。这是我为使其工作所做的工作。

我从 Visual Studio 中的一个 Windows 窗体项目开始。将 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 或整个页面。

编辑:此时您可以使用 webBrowser 的文档并抓取信息。通过在此处根据 MS 添加richTextBox 和公共变量: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
                }
                
            }
        }
    }
于 2013-05-14T18:10:21.953 回答
0

所以自动化 IE 是困难的,而且端到端不可用,所以我认为构建某种代码来完成它将是要走的路。在 github 我发现这个 python 可能很好

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

如果我有时间,我会尝试在 PowerShell 中做类似的事情。

于 2013-05-15T06:28:25.580 回答
0

Firefox有嵌入式工具。转到菜单(如果隐藏,请按 Alt)File->Convert saved pages

于 2016-08-25T07:44:51.410 回答
-2

第 1 步:在浏览器中打开 .MHT / .MHTML 文件。

第二步:右键选择查看源代码。

第 3 步:复制源代码并将其粘贴到新的 .TXT 文件中,然后将文件扩展名更改为 .HTML。

于 2017-04-08T11:53:47.500 回答