欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

lucene-索引HTML文档

程序员文章站 2022-05-15 17:43:34
...

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

}

}