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);

}

}

你可能感兴趣的:(apache,html,Web,Lucene)