【问题标题】:How can you programmatically (or with a tool) convert .MHT mhtml files to regular HTML and CSS files?您如何以编程方式(或使用工具)将 .MHT mhtml 文件转换为常规 HTML 和 CSS 文件?
【发布时间】:2013-04-18 15:41:58
【问题描述】:

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

【问题讨论】:

  • 您打算使用哪种编程语言?

标签: html converter mhtml


【解决方案1】:

好吧,您可以在 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[Boundary] 定义在 .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 会创建一个文件夹并单独保存图像等?我想知道你是否可以用 COM 对象自动化 IE 来做到这一点?
  • 是的,IE 会创建一个包含所有图像之类的文件夹。 COM 对象显示了一个Navigate2 函数和事件处理程序(用于完成等),但我在它的引用中找不到保存函数。不代表它不存在,只是我找不到它。
  • 我玩的更多了,我可以加载它,并保存它 hack 自动按键另存为对话框,这是 hacky 和脆弱的。但是它想将其保存为 MHT 而不是完整的 HTML(将网站在线保存为完整的网站可以正常工作),而且我找不到使用 ExecWB 来指定哪个另存为选项的方法,所以最好的办法可能是只需使用代码处理 MHT,或者尝试使用 selenium 或 forefox 或 chrome 自动化或扩展等其他类型的自动化..
  • 使用其中的一部分作为开​​始,我确实使用poconosystems.com/software-development/converting-mhtml-to-html 的简短 LINQ 语句制作了一个基本的纯标记解析器
【解决方案2】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 这是什么编程语言?
    • 这是 VB.Net。它使用开源包“Fizzler.Systems.HtmlAgilityPack”和商业包“Chilkat.Mime”。但是 Chilkat 可以替换为“System.Net.Mime”类。
    【解决方案4】:

    我认为@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
                    }
                    
                }
            }
        }
    

    【讨论】:

    • 根据你们的解决方案和这个stackoverflow.com/questions/872750/… 似乎没有弹出保存对话框似乎是不可能的。我希望能够自动化这个集合
    • 通过编辑,您可能会想出一个过程来抓取并保存 HTML 和图像。
    【解决方案5】:

    所以自动化 IE 很困难,而且端到端不可用,所以我认为构建某种代码来实现它将是可行的方法。在 github 上我发现了这个 python 可能不错

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多