23

多くのツールには、.MHT ファイルをエクスポートする方法があります。その単一のファイルをファイルのコレクション、HTML ファイル、関連する画像、および CSS ファイルに変換し、それを Web ホストにアップロードして、すべてのブラウザーで使用できるようにする方法が必要です。これを行うためのツール、ライブラリ、またはアルゴリズムを知っている人はいますか?

4

7 に答える 7

15

.MHT ファイルを IE で開き、[名前を付けて保存] Web ページを表示できます。私はこのページでこれをテストしました.IEでは奇妙に見えましたが(結局のところIEです)、保存してからChromeで正常に開きました(本来あるべきように見えました)。

その方法を除いて、ファイル自体を見ると、テキスト ブロックはそのままファイルに保存され、他のすべてのコンテンツは Base64 に保存されます。コンテンツの各項目の前には、次のものがあります。

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

[ Mime Type][Encoding Type]、および[コンテンツのフルパス]は可変です。[Encoding Type]はbase64またはquoted-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"

それを使用して、必要に応じて独自のファイル パーサーを作成できます。

于 2013-05-09T18:13:17.643 に答える
4

IE と MS Word の他に、 2007 年に最初に作成され、 2016 年に最後に更新された「mht2html」と呼ばれるオープンソースのクロスプラットフォーム プログラムがあります。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

@Xガンダム05が正しいと思います。これが私がそれを機能させるためにしたことです。

Visual Studio の Windows フォーム プロジェクトから始めました。WebBrowser をフォームに追加し、2 つのボタンを追加しました。次に、このコード:

    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 に答える