5.常用的数据解析组件

 

数据解析的过程就是从一种格式的数据文档中提取出我们需要的信息。

Word Pdf Excel XML

1.        解析 PDF 文档

PDF Portable Document Format ,便携式文档格式)

PDFBox 是一个开源的,可以操作 PDF 文档的 Java PDF 类库。它可以创建新的 PDF 文档,操作现有的 PDF 文档并提取文档中的内容。

主页: http://pdfbox.apache.org/

目录:

l             docs :产品文档和说明

l             src :源代码文件

l             external :外部类文件

l             lib :核心类文件

编译时,要把 PDFBox-0.73.jar 文件放到编译路径中。通常还会用到 external 目录内的某些文件,所以为了编译通过,最稳妥的办法是把 external lib 目录下的所有 jar 文件放到编译路径中。

1 PDFBox PDFTextStripper 类含有 getText 方法,用来从 PDF 文档中提取纯文本

PDDocument document = PDDocument.load("c:/java/Only you.pdf");

PDFTextStripper stripper = new PDFTextStripper();

String s = stripper.getText(Document);

       2 writeText 方法可以将 PDF 中的纯文本提取出来,写入一个输出流中,用这个方法可以很方便的把提取出的 PDF 内容输出到一个文本文件中。

示例一:提取 PDF 内容到字符串,利用 getText 方法

//PDFBoxA.java 提取 PDF 内容到字符串

import java.io.*;

 

import org.pdfbox.pdmodel.PDDocument;

import org.pdfbox.util.*;

 

public class PDFBoxA

{

       public String getText(String file) throws Exception

       {

              String pdfFile = file;

              PDDocument document = null;

              String s = "";

              try

              {

                     document = PDDocument.load(pdfFile);

                    

                     // PDFTextStripper 来提取文本

                     PDFTextStripper stripper = new PDFTextStripper();

                           

                     s=stripper.getText(document);

              }

              catch(Exception e)

              {

                     System.out.println(e);

              }

              finally

              {

                     if (document != null)

                     {

                            // 关闭 PDF Document

                            document.close();

                     }

              }

              return s;

       }

      

       public static void main(String[] args)

       {

              PDFBoxA a = new PDFBoxA();

              try

              {

                     String s = a.getText("D:/pdfbox/Only you.pdf");

                     System.out.println(s);

              }

              catch (Exception e)

              {

                     e.printStackTrace();

              }

       }

}

 

示例二:提取 PDF 内容输出到文本文件中,利用 writeText 方法

//PDFBoxB.java

import java.io.*;

 

import org.pdfbox.pdmodel.PDDocument;

import org.pdfbox.util.*;

 

public class PDFBoxB

{

       public void writeText(String file) throws Exception

       {

              String pdfFile = file;

              PDDocument document = null;

             

              try

              {

                     // 装载文件

                     document = PDDocument.load(pdfFile);

                    

                     // PDFTextStripper 来提取文本

                     PDFTextStripper stripper = new PDFTextStripper();

                    

                     // 提取文本,写入 pdfboxb.txt 文件

                     PrintWriter pw=new PrintWriter(new FileWriter("pdfboxb.txt"));      

                     stripper.writeText(document,pw);

                     pw.close();

                    

                     System.out.println(" 文本已经成功写入! ");

                    

              }

              catch(IOException ioe)

              {

                     System.out.println(" 文件读写错误! ");

                     System.out.println(ioe.getMessage());

              }

              finally

              {

                     if (document != null)

                     {

                            // 关闭 PDF Document

                            document.close();

                     }

              }

       }

      

       public static void main(String[] args)

       {

              PDFBoxB a = new PDFBoxB();

              try

              {

                     a.writeText("D:/pdfbox/Only you.pdf");

              }

              catch (Exception e)

              {

                     e.printStackTrace();

              }

       }

}

 

示例三:标准的 PDF 解析类,以后可以直接用

 

2.        解析 Word

POI 有一个附加组件包 textmining ,可以用来解析 Word 文档,从中提取文本

下载:

       // 创建输入流读取 DOC 文件

              FileInputStream in = new FileInputStream(new File(“c:/hello.doc”));

             

              // 创建 WordExtractor

              WordExtractor extractor = new WordExtractor();

             

              // 提取文本

              String text = extractor.extractText(in);

             

              // 写入文本文件

              PrintWriter pw=new PrintWriter(new FileWriter(new File(“c:/hello.txt”)));

              pw.write(text);

              pw.flush();

              pw.close();

3.        解析 Excel

 

POI 是专门用来处理 Excel 的组件。

Java Excel 也是用得较多的 Java 处理类库。

Java Excel API (简称 JExcel )是一个开发源代码项目,用来读取 Excel 文件内容、创建新 Excel 文件、更新已存在的文件。这是纯 Java 开发的组件,因此在非 Windows 系统中也可以用来处理 Excel

Web 应用中也可以通过 JSP Servlet 调用这套 API 实现对 Excel 数据表的访问。

 

4.        解析 XML

Java 中对 XML 的解析接口有三大类:基于 DOM 的、基于 SAX 的和基于 JDOM 的。

DOM 即文档对象模型,基于 DOM XML 解析器将 XML 文档解析成一个对象模型的集合(这个集合被称为 DOM 树),应用程序通过对该对象模型的操作,实现对 XML 文档中数据的操作。

SAX Simple API For XML ),即 XML 简单应用程序接口,提供了一种对 XML 文档进行顺序访问的模式,这是一种快速读写 XML 数据的方式。当使用 SAX 分析器对 XML 文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,从而完成对 XML 文档的访问。因此, SAX 接口也被称为事件驱动接口。

JDOM 的处理方式与 DOM 类似,是 SUN 公司方便的一种简单方便的 XML 处理接口。

基于这三种解析方式的 XML 解析器有多种,解析器实际上就是一段代码,它读入一个 XML 文档并分析其结构,目录主流的解析器有: JAXP Java API for XML Processing )、 Xerces apache )、 XML4J IBM )、 xalan 。主流的解析器都支持 SAX DOM

最常用的 DOM SAX 解析器是 xalan.jar xerces.jar JDOM 解析器只能用 jdom.jar ,但 jdom 在执行时需要 xerces.jar 包。

目前,对 XML 解析效果最好的解析器是 DOM4J

示例一:使用 DOM4J 解析 XML 文档

示例二: XML 文档标准解析器 ExtractorXML.java

在搜索引擎应用在,解析 XML 的最大意义是把 XML 文档解析成纯文本,然后建立索引。这种情况下,无需使用这些解析器,只要用正则表达式就可以了。借助于 Java 标准类库的正则表达式,可以将 XML 文档中所有的节点数据都提取出来。

public static String getText(String doc)

{

        StringBuffer sb=new StringBuffer("");

        try

        {

               FileReader fr=new FileReader(new File(doc));

               BufferedReader br=new BufferedReader(fr);

              

               String s=br.readLine();

               while(s!=null)

               {

                      s = s.replaceAll("<[a-zA-Z0-9]*[^<>]+>","");

                      s = s.trim();

                      sb.append(s);

                      s=br.readLine();

               }

               br.close();

        }

        catch(Exception e)

        {

               sb.append("");

        }

        return sb.toString();

}

 

5.        解析 HTML 文档

一个合乎 XML 标准的 HTML 文档就是 XHTML 文档

开源组件 HTMLParser 专门用来解析 HTML 文档

HTMLParser 是一个纯 java 写的 html 解析的库,它不依赖于其它的 java 库文件,主要用于改造或提取 HTML 。它能超高速解析 HTML ,而且不会出错。

功能:

1.    信息提取   

l         文本信息抽取,例如对 HTML 进行有效信息搜索   

l         链接提取,用于自动给页面的链接文本加上链接的标签   

l         资源提取,例如对一些图片、声音的资源的处理   

l         链接检查,用于检查 HTML 中的链接是否有效   

l         页面内容的监控   

2.    信息转换   

l         链接重写,用于修改页面中的所有超链接  

l         网页内容拷贝,用于将网页内容保存到本地   

l         内容检验,可以用来过滤网页上一些令人不愉快的字词   

l         HTML 信息清洗,把本来乱七八糟的 HTML 信息格式化   

l         转成 XML 格式数据

下载: http://htmlparser.sourceforge.net/

src.zip 是源代码文件; bin 是可执行脚本程序; docs 目录下是说明和 API 文档; lib jar 文件,有 6 个: junit.jar (测试)和 sax2.jar XML 解析)是第三方组件。其它 4 个组件是 HTMLParser 的专有组件 filterbuilder.jar htmlparser.jar htmllexer.jar thumbelina.jar

5.1    网页编码问题

网页一般用如下语句指明编码:

<meta http-equiv=”Content-Type” content=”text/html;charset=gb2312”>

HTMLParser 在解析页面时,首先提取爷们编码。如果页面中指明了编码方式,那么 HTMLParser 就按照这个编码方式去解析和显示数据,如果没有指明编码方式,就按照 ISO-8859-1 编码方式解析。

HTMLParser 处理网页的一般方法如下:

(1)       获得页面的编码方式

(2)       如果页面设定了编码,且编码方式正确,那么 HTMLParser 自由执行

(3)       如果页面设定了编码,但编码方式错误,那么要采用编码转换方式进行解析或者对解析结果进行编码转换

(4)       如果页面没设定编码,那么 HTMLParser 默认会按照 ISO-8859-1 的编码方式去解析网页。我们要改变其默认解析方式,采用编码转换的方式进行解析,或者对解析结果进行编码转换。

5.2    网页解析一般方法

(1)       未设定编码的中文网页

l         StringBean 类解析 BeanConvert.java

import org.htmlparser.beands.StringBean;

public static String getText(String f) throws Exception

    {

        StringBean sb = new StringBean ();

        sb.setLinks (false);

         sb.setReplaceNonBreakingSpaces (true);

        sb.setCollapse (true);

        sb.setURL (f);

        String s = sb.getStrings ();

         s = new String(s.getBytes("iso-8859-1")); // 对结果进行编码转换

        return s;

    }

l         TextExtractingVisitor 类解析 ParserConvert.java

import org.htmlparser.Parser;

import org.htmlparser.util.ParserException;

import org.htmlparser.visitors.TextExtractingVisitor;

 

public static String getText(String f) throws Exception

    {

        Parser parser = new Parser (f);

        TextExtractingVisitor visitor = new TextExtractingVisitor ();

        parser.visitAllNodesWith (visitor);

        String s = visitor.getExtractedText();

        s = new String(s.getBytes("iso-8859-1")); // 编码转换

        return s;

    }

(2)       设定正确编码的中文网页

l         StringBean 类解析 BeanNormal.java

import org.htmlparser.beans.StringBean;

 

public class BeanNormal

{

    public static void main (String[] args)

    {

           String file = "tb.htm";

           String s = getText(file);

         System.out.println (s);

    }

   

    public static String getText(String f)

    {

        StringBean sb = new StringBean ();

        sb.setLinks (false);

        sb.setReplaceNonBreakingSpaces (true);

        sb.setCollapse (true);

        sb.setURL (f);

        String s = sb.getStrings ();

// 只是没有结果编码转换那一步而已

        return s;

    }

}

l         TextExtractingVisitor 类解析 ParserNormal.java

//ParserNormal.java

package extractors;

 

import org.htmlparser.Parser;

import org.htmlparser.util.ParserException;

import org.htmlparser.visitors.TextExtractingVisitor;

 

public class ParserNormal

{

    public static void main (String[] args) throws Exception

    {

           String file = "tb.htm";

           String s = getText(file);

        System.out.println (s);

    }

   

    public static String getText(String f) throws Exception

    {

        Parser parser = new Parser (f);

        TextExtractingVisitor visitor = new TextExtractingVisitor ();

        parser.visitAllNodesWith (visitor);

        String s = visitor.getExtractedText();

// 只是没有结果编码转换那一步而已

          return s;

    }

}

 

(3)      设定了错误编码的页面

先去掉其编码标识,再进行解析

//ParserDelete.java

package extractors;

 

import org.htmlparser.Parser;

import org.htmlparser.util.ParserException;

import org.htmlparser.visitors.TextExtractingVisitor;

import java.io.*;

 

public class ParserDelete

{

    public static void main (String[] args) throws Exception

    {

           String file = "ta.htm";

           String s = getText(file);

        System.out.println (s);

    }

   

    public static String getText(String f) throws Exception

    {

           // 读取文件内容

              FileReader fr=new FileReader(f);

              BufferedReader br=new BufferedReader(fr);

             

              String s=br.readLine();

              StringBuffer sb=new StringBuffer("");

              while(s!=null)

              {

                     sb.append(s);

                     s=br.readLine();

              }

              br.close();

             

              // 除掉页面中原来设定的编码

              s = sb.toString().toLowerCase();

              s = s.replaceAll("<meta http-equive","<metaa");

             

              // 重新解析原文件

        Parser parser = new Parser (f);

       

         parser.setEncoding("gbk"); // 多的两行,设定编码,

        parser.setInputHTML(s);  // 输入

       

        TextExtractingVisitor visitor = new TextExtractingVisitor ();

        parser.visitAllNodesWith (visitor);

        s = visitor.getExtractedText();

       

        return s;

    }

}

 

5.3    常见解析请求

(1)      提取所有链接 linkFull.java

import org.htmlparser.NodeFilter;

import org.htmlparser.Parser;

import org.htmlparser.filters.NodeClassFilter;

import org.htmlparser.tags.LinkTag;

import org.htmlparser.util.NodeIterator;

import org.htmlparser.util.NodeList;

import org.htmlparser.util.ParserException;

 

public class LinkFull

{

    public static void main (String[] args)throws ParserException

    {

           String s = getText ("td.htm");

           System.out.println (s);

    }

   

    public static String getText(String f)throws ParserException

    {

        StringBuffer sb = new StringBuffer("");

 

        Parser parser = new Parser (f);

        NodeFilter filter = new NodeClassFilter (LinkTag.class); // 过滤标签

        NodeList links = new NodeList ();

        for (NodeIterator e = parser.elements (); e.hasMoreNodes (); )

        {

             e.nextNode ().collectInto (links, filter);

        }

       

        for (int i = 0; i < links.size (); i++)

        {

            LinkTag linkTag = (LinkTag)links.elementAt (i);

            sb.append("/"" + linkTag.getLinkText () + "/" => ");

             sb.append(linkTag.getLink ());

            sb.append("/n");

        }

 

        return sb.toString();

    }

}

 

(2)      只提取普通链接 LinkSimple.java 利用 LinkBean

//LinkSimple.java

package extractors;

 

import java.net.URL;

import org.htmlparser.beans.LinkBean;

 

public class LinkSimple

{

    public static void main (String[] args)

    {

           String s = getText ("td.htm");

           System.out.println (s);

    }

   

    public static String getText(String f)

    {

        StringBuffer sb = new StringBuffer("");

        LinkBean lb = new LinkBean ();

        lb.setURL (f);

        URL[] urls = lb.getLinks ();

        for (int i = 0; i < urls.length; i++)

        {

               sb.append(urls[i] + "/n");

        }

        return sb.toString();

    }

}

(3)      提取 Email EmailNormal.java (编码) EmailConvert.java (未指明编码)

(4)      提取网页 title body parsePage.java

import org.htmlparser.*;

import org.htmlparser.visitors.*;

import org.htmlparser.util.*;

 

public class ParserPage

{

    public static void main (String[] args) throws ParserException

    {

        Parser parser = new Parser ("te.htm");

        //parser.setEncoding("gbk");

       

        HtmlPage hp = new HtmlPage(parser);

       

        parser.visitAllNodesWith(hp);

       

        //title

         String title = hp.getTitle();

        System.out.println("title:" + title);

       

        //body--1

        NodeList body = hp.getBody();

        String b = body.asString();

        System.out.println("body:" + b);

    }

}

 

(5)      其它标签 CustomTag.java

import org.htmlparser.Node;

import org.htmlparser.Parser;

import org.htmlparser.util.ParserException;

import org.htmlparser.visitors.TagFindingVisitor;

import org.htmlparser.visitors.HtmlPage;

 

public class CustomTag

{

    public static void main (String[] args) throws ParserException

    {

        Parser parser = new Parser ("te.htm");

       

        String [] tags = {"title","body"};

       

        TagFindingVisitor visitor = new TagFindingVisitor (tags);

        parser.visitAllNodesWith (visitor);

       

        //title

        Node [] myTags = visitor.getTags(0);   

        String title = myTags[0].toPlainTextString();

       

        //body

        myTags = visitor.getTags(1);   

        String body = myTags[0].toPlainTextString();

       

        System.out.println("title:" + title);

        System.out.println("body:" + body);

       

    }

}

 

6.         集成解析器 ExtractorAll.java

根据扩展名,选择不同的解析器

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值