lucene-索引HTML文档

1、大部分WEB文档采用HTML格式。

2、本例用如下HTML文档

<html>

   <head>

      <title>

         Laptop power supplies are avaliable in First class only

       </title>

   </head>

    <body>

       <h1>code,write,fly</h1>

   </body>

</html>

3、使用JTidy

JTidy由Andy Quick编写的Tidy的Java版本。

public class JTidyHTMLHandler implements DocumentHandler{

   publicorg.apache.lucene.document.Document getDocument(InputStreamis) 

      throwsDocumentHandlerException{ //传入一个代表HTML文档的InputStream对象

   Tidy tidy=new Tidy();

   tidy.setQuiet(true);

   tidy.setShowWarnings(false);

  //解析代表HTML文档的InputStream对象

   org.w3c.dom.Documentroot=tidy.parseDOM(is,null);

   ElementrawDoc=root.getDocumentElement();

  

  org.apache.lucene.document.Document doc=neworg.apache.lucene.document.Document();

   Stringtitle=getTitle(rawDoc);//获得标题

   Stringbody=getBody(rawDoc);//获得<body>和</body>之间所有元素

   if((title!=null)&&(!title.equals("")))  {

     doc.add(Field.Text("title",title));

   }

   if((body!=null)&&(!body.equals(""))){

      doc.add(Field.Text("body",body));

   }

   return doc;

 }

 

 protected String getTitle(Element rawDoc){

    if(rawDoc==null){

        returnnull;

    }

   

    Stringtitle="";

    NodeListchildren=rawDoc.getElementsByTagName("title");

    if(chidren.getLength()>0){//获得第一个<title>标志的文本

      Element titleElement=((Element) children.item(0));

      Text text=(Text) titleElement.getFirstChild();

      if (text!=null){

         title=text.getData();

      }

    }

    returntitle;

 } 

 

 protected String getBody(ELement rawDoc){

    if (rawDoc==null){

        return null;

    }

    String body="";

    NodeList children=rawDoc.getElementByTagName("body");//获得<body>标志的引用

    if (children.getLength()>0){

        body=getText(childre.item(0));//提取<body>和</body>之间的所有文本

    }

    return body;

 }

 protected grtText(Node node){

    NodeListchildren=node.getChildNodes();

   StringBuffer sb=new StringBuffer();

    for (inti=0;i<children.getLength();i++){//提取在特定Node对象下元素中的文本

      Node children=node.getChildNodes();

      StringBuffer sb=new StringBuffer();

      for (int i=0;i<children.getLength();i++){

         Node child=children.item(i);

         switch (child.getNodeType()){

            case Node.ELEMENT_NODE:

                sb.append(getText(child));

                sb.append(" ");

                break;

            case Node.TEXT_NODE:

                sb.append(((Text) child).getData());

                break;

         }

      }

       returnsb.toString();

    }

   

    publicstatic void main(String args[]) throws Exception{

           JTidyHTMLHandler handler=new JTidyHTMLHandler();

           org.apache.lucene.document.Document doc=

                    handler.getDocument(new FileInputStream(new File(args[0])));

            System.out.println(doc);

    }

 }

}

4、使用NekoHTML

NekoHTML是一个简单的HTML扫描器和标签补偿器,它使程序员可以解析并通过标准的XML接口访问HTML文档。解析器扫描HTML文件并修改开发者和计算机用户在编写HTML文档时所犯罪的大量常见错误。

public class NekoHTMLHandler implements Document{

   private DOMFragmentParserparser=new DOMFragmentParser();//NEKO针对HTML的DOM解析器

   public DocumentgetDocument(InputStream is) throws DocumentHandlerException{

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

         try{

            parser.parse(new InputSouce(id),node); 

         }

         catch (IOException e){

             throw new DocumentHandlerException("cannot parse HTML document",e);

         }

         catch (SAXException e){

             throw new DocumentHandlerException("cannot parse HTMLdocument",e);

         }

         

         org.apache.lucene.document.Document doc=

             new org.apache.lucene.document.Document();

         //提取/存储title中的文本

         StringBuffer sb=new StringBuffer();

         getText(sb,node,"title");

         String title=sb.toString();

         //清空stringbuffer

         sb.setLength(0);

         //从DOM NODE对象中提取出所有文本

         getText(sb,node);

         String text=sb.toString();

         if((title!=null)&&(!title.equals("")))  {

             doc.add(Field.Text("title",title));

         }

         if((body!=null)&&(!body.equals(""))){

             doc.add(Field.Text("body",text));

          }

   return doc;

  }

 

  private void getText(StringBuffer sb,Nodenode){

    if (node.getNodeType()==Node.TEXT_NODE){//从DOMNode对象中提取出表示特定元素的所有文本

         sb.append(node.getNodeValue());

    }

    Nodelist children=node.getChildNodes();

    if (children!=null){

       int len=children.getLength();

       for (int i=0;i<len;i++){

           getText(sb,children.item(i));

       }

    }

  }

 

  private booleangetText(StringBuffer sb,Node node,String element){

 //从Node对象中提取表示特定元素的所有文本

    if (node.getNodeType()==Node.ELEMENT_NODE){

         if(element.equalsIgnoreCase(node.getNodeName())){

             getText(sb,node);

            return true;

        }

    }

    NodeList children=node.getChildNodes();

    if (children!=null){

         intlen=chidren.getLength();

        for (int i=0;i<len;i++){

           if (getText(sb,children.item(i)),element){

               return true;

           }

        }

    }

    return false;

  } 

  public static void main(String args[]) throwsException{

       NekoHTMLHandler handler=new NekoHTMLHandler();

       org.apache.lucene.document.Document doc=

           handler.getDocument(new FileInputStream(new File(args[0])));

       System.out.println(doc);

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值