`
betafox
  • 浏览: 146883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现MHT文件格式的解析和内容抽取

阅读更多

由于我们的业务系统中有大量的MHT格式的资料,需要对其建立索引,搜索很久了一直没有找到相关解析的类库,只好自己动手丰衣足食了。已实现内容的提取以及和lucene的整合,稍后会完善编码检测及其他内容的提取,做一个完整的parser出来。  

 

  • 文本内容提取:  首先提取html部分的内容,解码之后使用nekoHtml提取文本内容;
public class MhtDocHandler extends HtmDocHandler {

    private DOMFragmentParser parser = new DOMFragmentParser();

    public Document getDocument(InputStream is) throws DocumentHandlerException {

        DocumentFragment node = new HTMLDocumentImpl().createDocumentFragment();
        try {

            String mhts = IOUtils.toString(is);
            int a1 = mhts.indexOf("<HTML");
            int a2 = mhts.indexOf("</HTML>");

            String html = mhts.substring(a1, a2 + 8);

            //在mht中文本按照QuotedPrintable格式编码
        html = decodeQuotedPrintable(html, "UTF-8");

            StringReader r = new StringReader(html);

            parser.parse(new InputSource(r), node);
        }
        catch (Exception e) {
            throw new DocumentHandlerException("Cannot parse MHT document: ", e);
        }

        Document doc = new Document();

        StringBuffer sb = new StringBuffer();
        getText(sb, node, "title");
        String title = sb.toString().trim();

        sb.setLength(0);
        getText(sb, node, "body");
        String text = sb.toString().trim();

        if (!title.equals("")) {
            doc.add(new Field(WikiDOC.DOC_TITLE, title, 
                                  Field.Store.YES, Field.Index.TOKENIZED, 
                                       Field.TermVector.WITH_POSITIONS_OFFSETS));
        }
        if (!text.equals("")) {
            doc.add(new Field(WikiDOC.DOC_CONTENT, text, 
                                       Field.Store.COMPRESS, Field.Index.TOKENIZED, 
                                           Field.TermVector.WITH_POSITIONS_OFFSETS));
        }

        return doc;
    }

    public static String decodeQuotedPrintable(String str, String encoding) {
        if (str == null) {
            return null;
        }
        try {
            //str = str.replaceAll("=\n", "");//??
            byte[] bytes = str.getBytes("US-ASCII");

            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            for (int i = 0; i < bytes.length; i++) {
                int b = bytes[i];
                if (b == '=') {
                    int u = Character.digit((char) bytes[++i], 16);
                    int l = Character.digit((char) bytes[++i], 16);
                    if (u == -1 || l == -1) {//??
                        continue;
                    }
                    buffer.write((char) ((u << 4) + l));
                } else {
                    buffer.write(b);
                }
            }
            return buffer.toString(encoding);
        }
        catch (Exception e) {
            e.printStackTrace();
            return str;
        }
    }

}

 <!---->

分享到:
评论
3 楼 xiaoll880214 2013-11-05  
您好!利用你贴的decodeQuotedPrintable方法,解出来的mht文件内容还是乱码,请问你解决了么,分享下,谢谢!
2 楼 cllstudy 2013-01-25  
您好,急需lucene对mht解析的parse,能发源代码给我吗?非常感谢!邮箱:cll_java@163.com.
1 楼 rainsf 2008-04-01  
good job

相关推荐

    java对mht文件解析

    本文详细介绍了使用Java解析MHT文件的基本原理和技术实现,包括如何提取HTML内容、解码Quoted-Printable编码、构建DOM树以及提取所需数据。这对于需要处理MHT文件的应用开发具有很高的参考价值。

    java将网页保存成mht格式文件

    MHT文件是一种单一的、自包含的档案格式,它能够保存网页的完整内容,包括HTML、图像和其他嵌入的对象。这个【标题】"java将网页保存成mht格式文件"指向的是一个Java项目,其目的是将网页转换为MHT格式,以便离线...

    访问URL生成Mht文件

    7. **生成MHT文件**:将解析后的HTML内容和编码后的资源组合成MHT格式的文件。MHT文件通常包含一个头部,定义了文件的MIME类型和所有资源的位置,然后是HTML内容,其中嵌入了资源引用。 8. **Java编程**:`...

    java将mht转化为html

    - `Session.getDefaultInstance()`和`MimeMessage`类可以用来解析MHT文件,将其内容封装为`MimeMultipart`对象。 2. **解析MIME Multi-part**: - MHT文件通常采用MIME multi-part格式存储数据,其中第一部分通常...

    mht2html,可以将mht文件转换成html文件

    MHT(MHTML)文件是一种单一的文件格式,它包含了网页的所有内容,包括HTML代码、图像、CSS样式和脚本等资源。这种格式通常用于保存Web页面,以便离线查看或便于传输。然而,不是所有的浏览器都支持MHT格式,这时就...

    vs2008源码 对话框显示本地网页mht文件

    本主题聚焦于如何在VS2008的源码中实现一个对话框,该对话框能有效地显示本地的MHT文件,这种文件格式通常用于存储单一文件的网页内容,包括文字、图片以及其他多媒体元素。MHT全称为MHTML(MIME HTML),是Web页面...

    解析mht乱码

    解析网页另存为mht出现的乱码问题,比如乱码:=D4=DA=CF=DF=C1=AA=CF=B5

    mht 转换成html文件

    这种转换过程对于处理Web内容和跨浏览器兼容性问题至关重要。下面我们将深入探讨.mht和.html文件格式的区别以及转换过程中的相关技术。 **.mht文件格式** MHT(MHTML,MIME HTML)是一种单一文件格式,用于存储网页...

    VS之mht文件显示

    【标题】:“VS之mht...总之,“VS之mht文件显示”涵盖了HTML基础、MHT文件格式的理解以及在VS环境下如何处理这类文件的技巧。通过理解和应用这些知识点,开发者可以更有效地在VS中管理和查看MHT文件,提高工作效率。

    保存硬盘上的Htm文件为Mht文件

    总之,将HTML文件转换为MHT文件涉及到文件I/O、HTML解析、资源下载和MIME编码等多个技术点,这些都需要对编程和网络协议有深入理解。通过使用Delphi这样的高级开发工具,可以简化这个过程并提高效率。

    Mht格式QQ聊天记录mht转Html格式

    MHT全称为Merged HTML,它是一种单一文件格式,将HTML代码、图片、样式表等资源都打包在一个文件内,方便保存和传输。而HTML则是标准的超文本标记语言,通常用于创建网页,各元素如图片、脚本等需要链接到外部文件。...

    怎样在安卓手机上用浏览器打开mht格式网页文件这里以Zmini手机为例PPT学习教案.pptx

    这是因为MHT格式文件需要特殊的解析和渲染,普通的浏览器无法正确地解析和展示MHT格式文件中的内容。 解决这个问题有多种方法。第一种方法是使用特殊的浏览器插件或应用程序来打开MHT格式文件。例如,可以使用支持...

    VC++源码保存网页为MHT文件(包含图片及其它资源)

    5. **文件操作**:在VC++中,需要使用文件I/O函数(如fopen、fwrite等)来读写文件,将网页的HTML内容和资源数据写入MHT文件。 6. **多线程编程**:在`SaveAsThread.cpp`中,可能涉及到了多线程技术,用于异步保存...

    MHT编辑软件

    MHTML全称为"Multimedia Hypertext Transfer Protocol",它是一种文件格式,能够将网页内容,包括HTML代码、图像、样式表和其他资源,打包到一个单一的文件中,方便保存和分享。MHT编辑器提供了“所见即所得”...

    mht文件转换成html

    MHT(MHTML,Merged HTML)是一种单一文件格式,它将网页的所有资源,包括图像、样式表和脚本,都打包在一个文件中。然而,不是所有的浏览器都支持MHT文件,这就是为什么有时需要将其转换为更通用的HTML格式。 MHT...

    提取mht中的文件,Delphi源代码

    标题 "提取mht中的文件,Delphi源代码" 涉及的是在Delphi...通过阅读和理解这些源代码,开发者可以学习到文件解析、数据编码解码以及图像处理等方面的知识,这些技能在处理多种类型的文件格式和网络数据时都非常有用。

    mht格式转html格式

    标题中的“mht格式转html格式”指的是将MHT(MHTML,单个文件Web页面)文件转换为HTML(超文本标记语言)文件的过程。...总的来说,MHT到HTML的转换是一个实用的功能,尤其对于处理网络内容和网页保存的场景。

    mht转html文件

    在IT行业中,MHT(MHTML)和HTML是两种不同的文件格式,它们各自有特定的用途和特点。本文将详细探讨“MHT转HTML”这一主题,帮助你理解这两种格式的区别,以及如何进行转换。 MHT(MHTML,即MIME HTML)是一种单一...

    html转MHT格式

    3. **构建MHT头部**:MHT文件以MIME格式开始,包括一个`Content-Type`头,声明文件类型为MHTML,以及`boundary`字段,用于区分不同的HTML内容和资源。 4. **组装MHT内容**:根据MIME格式,将HTML源码和Base64编码的...

    QQ聊天记录Mht转Html格式.rar

    该工具用于将较大的MHT格式的QQ记录转换成HTML文本内容和对应的图片附件,解决记录较大时无法打开的问题 将该工具与聊天记录放在同一级目录,并进入命令行调用,调用步骤如下: 第1步: QQMhtToHtml.exe getimg 会在img...

Global site tag (gtag.js) - Google Analytics