`

lucene如何抽取html网页

阅读更多
要解析html页面 就要对html中的标签做处理

先准备几个工具类
package com.cs.parser.util;


import org.htmlparser.Node;

public class PageContent {
	
    private StringBuffer textBuffer;
    private int number;
    private Node node;

    public Node getNode() {
		return node;
	}

	public void setNode(Node node) {
		this.node = node;
	}

	public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public StringBuffer getTextBuffer() {
        return textBuffer;
    }

    public void setTextBuffer(StringBuffer textBuffer) {
        this.textBuffer = textBuffer;
    }
}


package com.cs.parser.util;



public class TableValid {
    private int trnum;
    private int tdnum;
    private int linknum;
    private int textnum;
    private int scriptnum;

    public int getScriptnum() {
        return scriptnum;
    }

    public void setScriptnum(int scriptnum) {
        this.scriptnum = scriptnum;
    }

    public int getLinknum() {
        return linknum;
    }

    public void setLinknum(int linknum) {
        this.linknum = linknum;
    }

    public int getTdnum() {
        return tdnum;
    }

    public void setTdnum(int tdnum) {
        this.tdnum = tdnum;
    }

    public int getTextnum() {
        return textnum;
    }

    public void setTextnum(int textnum) {
        this.textnum = textnum;
    }

    public int getTrnum() {
        return trnum;
    }

    public void setTrnum(int trnum) {
        this.trnum = trnum;
    }
}


package com.cs.parser.util;

public class TableColumnValid {
    int tdNum;
    boolean valid;
	public int getTdNum() {
		return tdNum;
	}
	public void setTdNum(int tdNum) {
		this.tdNum = tdNum;
	}
	public boolean isValid() {
		return valid;
	}
	public void setValid(boolean valid) {
		this.valid = valid;
	}

  
}


接下来看看如何解析html页面
加入htmlparser.jar包
package com.cs;

public interface Parsable {
	
	public String getTitle() ;
	public String getContent()  ;
	public String getSummary()  ;
}

package com.cs;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.ParagraphTag;
import org.htmlparser.tags.ScriptTag;
import org.htmlparser.tags.SelectTag;
import org.htmlparser.tags.Span;
import org.htmlparser.tags.StyleTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableHeader;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.tags.TitleTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import com.cs.parser.util.PageContent;
import com.cs.parser.util.TableColumnValid;
import com.cs.parser.util.TableValid;
 

public class EasyHtmlParser implements Parsable {
	
	 protected static final String lineSign = System.getProperty(
     "line.separator");
	 protected static final int lineSign_size = lineSign.length();

	
	private File file ;
	
	private String content ;
	private String summary ;
	private String title ;
	
	
	public static void main(String[] args) {
		EasyHtmlParser eParser = new EasyHtmlParser(new File("E:\\EclipseStudyWorkspace\\LuceneParse\\fileSource\\www.htm")) ;
		System.out.println("html content : "+eParser.getContent()) ;
	}
	
	
	public EasyHtmlParser(File file) {
		this.file = file ;
	}
	
	private String getString() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))) ;
			String html = "" ;
			String str = null ;
			while ((str = br.readLine())!= null ) {
				html += str ;
			}
			return html ;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null ;
	}
	
	
	public synchronized   String getContent() {
		if (content != null ) {
			return content ;
		}
		String html = this.getString() ;
		Parser parser = new Parser() ;
		 
		try {
			 parser.setInputHTML(html) ;
			 for (NodeIterator e = parser.elements(); e.hasMoreNodes();){
				       Node node = (Node) e.nextNode();
				 
		            	
	                	PageContent context = new PageContent();
	                    context.setNumber(0);
	                    context.setTextBuffer(new StringBuffer());
	                    //抓取出内容
	                    extractHtml(node, context, "");

	                    StringBuffer testContext = context.getTextBuffer();
	   //System.out.println(testContext);
	                    content = testContext.toString() ;
				  
			 }
			 
					if (content == null ) {
			        	content = "" ;
			        }
	                
	                if (content.length() < 200) {
	        			summary = content ;
	        		}else {
	        			summary = content.substring(0,200) ;
	        		}  
	                
	                NodeFilter filter = new NodeClassFilter(TitleTag.class) ;
	                parser.reset() ;
	                NodeList titleNodes = parser.extractAllNodesThatMatch(filter) ;
	                if (titleNodes != null && titleNodes.elementAt(0) != null){
	                	title = titleNodes.elementAt(0).toPlainTextString() ;
	                }else{
	                	title = "" ;
	                }
	                
	              /*  System.out.println(file.getAbsolutePath()+"   "+"title:"+title);
	        		System.out.println(file.getAbsolutePath()+"   "+"content:"+content);
	        		System.out.println(file.getAbsolutePath()+"   "+"summary:"+summary); 
					*/
		} catch (ParserException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	
		return content;
	}

	public String getSummary() {
		if (summary != null) {
			return summary ;
		}
		if (content == null ) {
			getContent() ; 			
		}
		return summary;
	}

	public String getTitle() {
		if (title != null) {
			return title ;
		}
		if (content == null ) {
			getContent() ; 			
		}
		
		
		return "";
	}
	
    protected List extractHtml(Node nodeP, PageContent pageContent, String siteUrl) throws Exception {
	    NodeList nodeList = nodeP.getChildren();
	    boolean bl = false;
	
	    if ((nodeList == null) || (nodeList.size() == 0)) {
	        if (nodeP instanceof ParagraphTag) {
	            ArrayList tableList = new ArrayList();
	            StringBuffer temp = new StringBuffer();
	            temp.append("<p style=\"TEXT-INDENT: 2em\">");
	            tableList.add(temp);
	            temp = new StringBuffer();
	            temp.append("</p>").append(lineSign);
	            tableList.add(temp);
	
	            return tableList;
	        }
	
	        return null;
	    }
	
	    if ((nodeP instanceof TableTag) || (nodeP instanceof Div)) {
	        bl = true;
	    }
	
	    if (nodeP instanceof ParagraphTag) {
	        ArrayList tableList = new ArrayList();
	        StringBuffer temp = new StringBuffer();
	        temp.append("<p style=\"TEXT-INDENT: 2em\">");
	        tableList.add(temp);
	        extractParagraph(nodeP, siteUrl, tableList);
	
	        temp = new StringBuffer();
	        temp.append("</p>").append(lineSign);
	
	        tableList.add(temp);
	
	        return tableList;
	    }
	
	    ArrayList tableList = new ArrayList();
	
	    try {
	        for (NodeIterator e = nodeList.elements(); e.hasMoreNodes();) {
	            Node node = (Node) e.nextNode();
	
	            if (node instanceof LinkTag) {
	                tableList.add(node);
	                setLinkImg(node, siteUrl);
	            } else if (node instanceof ImageTag) {
	                ImageTag img = (ImageTag) node;
	
	                if (img.getImageURL().toLowerCase().indexOf("http://") < 0) {
	                    img.setImageURL(siteUrl + img.getImageURL());
	                } else {
	                    img.setImageURL(img.getImageURL());
	                }
	
	                tableList.add(node);
	            } else if (node instanceof ScriptTag ||
	                    node instanceof StyleTag || node instanceof SelectTag) {
	            } else if (node instanceof TextNode) {
	                if (node.getText().length() > 0) {
	                    StringBuffer temp = new StringBuffer();
	                    String text = collapse(node.getText()
	                                               .replaceAll("&nbsp;", "")
	                                               .replaceAll(" ", ""));
	
	                    temp.append(text.trim());
	
	                    tableList.add(temp);
	                }
	            } else {
	                if (node instanceof TableTag || node instanceof Div) {
	                    TableValid tableValid = new TableValid();
	                    isValidTable(node, tableValid);
	
	                    if (tableValid.getTrnum() > 2) {
	                        tableList.add(node);
	
	                        continue;
	                    }
	                }
	
	                List tempList = extractHtml(node, pageContent, siteUrl);
	
	                if ((tempList != null) && (tempList.size() > 0)) {
	                    Iterator ti = tempList.iterator();
	
	                    while (ti.hasNext()) {
	                        tableList.add(ti.next());
	                    }
	                }
	            }
	        }
	    } catch (Exception e) {
	        return null;
	    }
	
	    if ((tableList != null) && (tableList.size() > 0)) {
	        if (bl) {
	            StringBuffer temp = new StringBuffer();
	            Iterator ti = tableList.iterator();
	            int wordSize = 0;
	            StringBuffer node;
	            int status = 0;
	            StringBuffer lineStart = new StringBuffer(
	                    "<p style=\"TEXT-INDENT: 2em\">");
	            StringBuffer lineEnd = new StringBuffer("</p>" + lineSign);
	
	            while (ti.hasNext()) {
	                Object k = ti.next();
	
	                if (k instanceof LinkTag) {
	                    if (status == 0) {
	                        temp.append(lineStart);
	                        status = 1;
	                    }
	
	                    node = new StringBuffer(((LinkTag) k).toHtml());
	                    temp.append(node);
	                } else if (k instanceof ImageTag) {
	                    if (status == 0) {
	                        temp.append(lineStart);
	                        status = 1;
	                    }
	
	                    node = new StringBuffer(((ImageTag) k).toHtml());
	                    temp.append(node);
	                } else if (k instanceof TableTag) {
	                    if (status == 0) {
	                        temp.append(lineStart);
	                        status = 1;
	                    }
	
	                    node = new StringBuffer(((TableTag) k).toHtml());
	                    temp.append(node);
	                } else if (k instanceof Div) {
	                    if (status == 0) {
	                        temp.append(lineStart);
	                        status = 1;
	                    }
	
	                    node = new StringBuffer(((Div) k).toHtml());
	                    temp.append(node);
	                } else {
	                    node = (StringBuffer) k;
	
	                    if (status == 0) {
	                        if (node.indexOf("<p") < 0) {
	                            temp.append(lineStart);
	                            temp.append(node);
	                            wordSize = wordSize + node.length();
	                            status = 1;
	                        } else {
	                            temp.append(node);
	                            status = 1;
	                        }
	                    } else if (status == 1) {
	                        if (node.indexOf("</p") < 0) {
	                            if (node.indexOf("<p") < 0) {
	                                temp.append(node);
	                                wordSize = wordSize + node.length();
	                            } else {
	                                temp.append(lineEnd);
	                                temp.append(node);
	                                status = 1;
	                            }
	                        } else {
	                            temp.append(node);
	                            status = 0;
	                        }
	                    }
	                }
	            }
	
	            if (status == 1) {
	                temp.append(lineEnd);
	            }
	
	            if (wordSize > pageContent.getNumber()) {
	                pageContent.setNumber(wordSize);
	                pageContent.setTextBuffer(temp);
	            }
	
	            return null;
	        } else {
	            return tableList;
	        }
	    }
	
	    return null;
}
	
	
	/**
	    * 提取段落中的内容
	    * @param nodeP
	    * @param siteUrl
	    * @param tableList
	    * @return
	    */
	    private List extractParagraph(Node nodeP, String siteUrl, List tableList) {
	        NodeList nodeList = nodeP.getChildren();

	        if ((nodeList == null) || (nodeList.size() == 0)) {
	            if (nodeP instanceof ParagraphTag) {
	                StringBuffer temp = new StringBuffer();
	                temp.append("<p style=\"TEXT-INDENT: 2em\">");
	                tableList.add(temp);
	                temp = new StringBuffer();
	                temp.append("</p>").append(lineSign);
	                tableList.add(temp);

	                return tableList;
	            }

	            return null;
	        }

	        try {
	            for (NodeIterator e = nodeList.elements(); e.hasMoreNodes();) {
	                Node node = (Node) e.nextNode();

	                if (node instanceof ScriptTag || node instanceof StyleTag ||
	                        node instanceof SelectTag) {
	                } else if (node instanceof LinkTag) {
	                    tableList.add(node);
	                    setLinkImg(node, siteUrl);
	                } else if (node instanceof ImageTag) {
	                    ImageTag img = (ImageTag) node;

	                    if (img.getImageURL().toLowerCase().indexOf("http://") < 0) {
	                        img.setImageURL(siteUrl + img.getImageURL());
	                    } else {
	                        img.setImageURL(img.getImageURL());
	                    }

	                    tableList.add(node);
	                } else if (node instanceof TextNode) {
	                    if (node.getText().trim().length() > 0) {
	                        String text = collapse(node.getText()
	                                                   .replaceAll("&nbsp;", "")
	                                                   .replaceAll(" ", ""));
	                        StringBuffer temp = new StringBuffer();
	                        temp.append(text);
	                        tableList.add(temp);
	                    }
	                } else if (node instanceof Span) {
	                    StringBuffer spanWord = new StringBuffer();
	                    getSpanWord(node, spanWord);

	                    if ((spanWord != null) && (spanWord.length() > 0)) {
	                        String text = collapse(spanWord.toString()
	                                                       .replaceAll("&nbsp;", "")
	                                                       .replaceAll(" ", ""));

	                        StringBuffer temp = new StringBuffer();
	                        temp.append(text);
	                        tableList.add(temp);
	                    }
	                } else if (node instanceof TagNode) {
	                    String tag = node.toHtml();

	                    if (tag.length() <= 10) {
	                        tag = tag.toLowerCase();

	                        if ((tag.indexOf("strong") >= 0) ||
	                                (tag.indexOf("b") >= 0)) {
	                            StringBuffer temp = new StringBuffer();
	                            temp.append(tag);
	                            tableList.add(temp);
	                        }
	                    } else {
	                        if (node instanceof TableTag || node instanceof Div) {
	                            TableValid tableValid = new TableValid();
	                            isValidTable(node, tableValid);

	                            if (tableValid.getTrnum() > 2) {
	                                tableList.add(node);

	                                continue;
	                            }
	                        }

	                        extractParagraph(node, siteUrl, tableList);
	                    }
	                }
	            }
	        } catch (Exception e) {
	            return null;
	        }

	        return tableList;
	    }
	    
	    
	    protected void getSpanWord(Node nodeP, StringBuffer spanWord) {
	        NodeList nodeList = nodeP.getChildren();

	        try {
	            for (NodeIterator e = nodeList.elements(); e.hasMoreNodes();) {
	                Node node = (Node) e.nextNode();

	                if (node instanceof ScriptTag || node instanceof StyleTag ||
	                        node instanceof SelectTag) {
	                } else if (node instanceof TextNode) {
	                    spanWord.append(node.getText());
	                } else if (node instanceof Span) {
	                    getSpanWord(node, spanWord);
	                } else if (node instanceof ParagraphTag) {
	                    getSpanWord(node, spanWord);
	                } else if (node instanceof TagNode) {
	                    String tag = node.toHtml().toLowerCase();

	                    if (tag.length() <= 10) {
	                        if ((tag.indexOf("strong") >= 0) ||
	                                (tag.indexOf("b") >= 0)) {
	                            spanWord.append(tag);
	                        }
	                    }
	                }
	            }
	        } catch (Exception e) {
	        }

	        return;
	    }

	    /**
	    * 判断TABLE是否是表单
	    * @param nodeP
	    * @return
	    */
	    private void isValidTable(Node nodeP, TableValid tableValid) {
	        NodeList nodeList = nodeP.getChildren();

	        /**如果该表单没有子节点则返回**/
	        if ((nodeList == null) || (nodeList.size() == 0)) {
	            return;
	        }

	        try {
	            for (NodeIterator e = nodeList.elements(); e.hasMoreNodes();) {
	                Node node = (Node) e.nextNode();

	                /**如果子节点本身也是表单则返回**/
	                if (node instanceof TableTag || node instanceof Div) {
	                    return;
	                } else if (node instanceof ScriptTag ||
	                        node instanceof StyleTag || node instanceof SelectTag) {
	                    return;
	                } else if (node instanceof TableColumn) {
	                    return;
	                } else if (node instanceof TableRow) {
	                    TableColumnValid tcValid = new TableColumnValid();
	                    tcValid.setValid(true);
	                    findTD(node, tcValid);

	                    if (tcValid.isValid()) {
	                        if (tcValid.getTdNum() < 2) {
	                            if (tableValid.getTdnum() > 0) {
	                                return;
	                            } else {
	                                continue;
	                            }
	                        } else {
	                            if (tableValid.getTdnum() == 0) {
	                                tableValid.setTdnum(tcValid.getTdNum());
	                                tableValid.setTrnum(tableValid.getTrnum() + 1);
	                            } else {
	                                if (tableValid.getTdnum() == tcValid.getTdNum()) {
	                                    tableValid.setTrnum(tableValid.getTrnum() +
	                                        1);
	                                } else {
	                                    return;
	                                }
	                            }
	                        }
	                    }
	                } else {
	                    isValidTable(node, tableValid);
	                }
	            }
	        } catch (Exception e) {
	            return;
	        }

	        return;
	    }

	    /**
	    * 判断是否有效TR
	    * @param nodeP
	    * @param TcValid
	    * @return
	    */
	    private void findTD(Node nodeP, TableColumnValid tcValid) {
	        NodeList nodeList = nodeP.getChildren();

	        /**如果该表单没有子节点则返回**/
	        if ((nodeList == null) || (nodeList.size() == 0)) {
	            return;
	        }

	        try {
	            for (NodeIterator e = nodeList.elements(); e.hasMoreNodes();) {
	                Node node = (Node) e.nextNode();

	                /**如果有嵌套表单**/
	                if (node instanceof TableTag || node instanceof Div ||
	                        node instanceof TableRow ||
	                        node instanceof TableHeader) {
	                    tcValid.setValid(false);

	                    return;
	                } else if (node instanceof ScriptTag ||
	                        node instanceof StyleTag || node instanceof SelectTag) {
	                    tcValid.setValid(false);

	                    return;
	                } else if (node instanceof TableColumn) {
	                    tcValid.setTdNum(tcValid.getTdNum() + 1);
	                } else {
	                    findTD(node, tcValid);
	                }
	            }
	        } catch (Exception e) {
	            tcValid.setValid(false);

	            return;
	        }

	        return;
	    }

	    protected String collapse(String string) {
	        int chars;
	        int length;
	        int state;
	        char character;
	        StringBuffer buffer = new StringBuffer();
	        chars = string.length();

	        if (0 != chars) {
	            length = buffer.length();
	            state = ((0 == length) || (buffer.charAt(length - 1) == ' ') ||
	                ((lineSign_size <= length) &&
	                buffer.substring(length - lineSign_size, length).equals(lineSign)))
	                ? 0 : 1;

	            for (int i = 0; i < chars; i++) {
	                character = string.charAt(i);

	                switch (character) {
	                case '\u0020':
	                case '\u0009':
	                case '\u000C':
	                case '\u200B':
	                case '\u00a0':
	                case '\r':
	                case '\n':

	                    if (0 != state) {
	                        state = 1;
	                    }

	                    break;

	                default:

	                    if (1 == state) {
	                        buffer.append(' ');
	                    }

	                    state = 2;
	                    buffer.append(character);
	                }
	            }
	        }

	        return buffer.toString();
	    }
	    
	    
	    /**
	     * 设置图象连接
	     * @param nodeP
	     * @param siteUrl
	     */
	     private void setLinkImg(Node nodeP, String siteUrl) {
	         NodeList nodeList = nodeP.getChildren();

	         try {
	             for (NodeIterator e = nodeList.elements(); e.hasMoreNodes();) {
	                 Node node = (Node) e.nextNode();

	                 if (node instanceof ImageTag) {
	                     ImageTag img = (ImageTag) node;

	                     if (img.getImageURL().toLowerCase().indexOf("http://") < 0) {
	                         img.setImageURL(siteUrl + img.getImageURL());
	                     } else {
	                         img.setImageURL(img.getImageURL());
	                     }
	                 }
	             }
	         } catch (Exception e) {
	             return;
	         }

	         return;
	     }

}


现在可以成功的把html解析为纯文本了
分享到:
评论

相关推荐

    基于Lucene的小型搜索引擎

    这一步可以使用Jsoup或者其他HTML解析库完成,将HTML文本转换成结构化的数据,例如将歌曲名、歌手名等信息抽取出来,并保存为本地的TXT文件,或者直接存储到数据库中,如MySQL或MongoDB,便于后续操作。 接下来是...

    lucene.net及.net爬虫实现的简单搜索引擎

    在.NET中,可以使用HtmlAgilityPack或AngleSharp等库来解析和操作HTML文档,便于数据抽取。 接下来,我们将讨论如何使用Redis缓存数据库作为中间件。Redis是一个开源的、高性能的键值存储系统,特别适合用于数据...

    开发自己的搜索引擎lucene+heritrix(第2版)(ch13-ch15源码)

    1. **数据流集成**:Heritrix爬取的网页内容可以被直接送入Lucene进行索引,实现对互联网内容的实时搜索。 2. **深度搜索**:结合Heritrix的爬虫能力,Lucene的搜索引擎可以对互联网上的大量数据进行深度搜索,提高...

    基于Heritrix与Lucene的垂直搜索引擎研究

    抓取到的网页数据通常是非结构化的HTML文档,需要通过网页信息抽取技术将其转换为结构化的数据。这一过程涉及对HTML文档的解析、内容识别以及信息抽取。在新闻垂直搜索引擎的场景下,这一步骤主要包括提取新闻标题、...

    基于Heritrix与Lucene的垂直搜索引擎研究.pdf

    这一步骤通常涉及HTML解析和自然语言处理技术,目的是将非结构化的网页文本转换为结构化数据,便于后续的索引和查询。 ##### 3. 中文分词 中文分词是中文信息处理的关键步骤,对于建立有效的中文搜索索引至关重要...

    Lucene2.0+Heritrix(ch3源代码)

    这部分源代码涉及到HTML解析和内容抽取。 通过深入研究这两个项目的源代码,开发者不仅可以理解它们的基本工作原理,还可以学习如何将它们整合到自己的项目中,实现更高效的全文搜索和网络数据抓取。这对于构建大...

    IKAnalyzer LUCENE.4.9 中文分词的高亮显示

    3. HTMLFormatter用于将高亮的关键词包裹在特定的HTML标签中,如`&lt;em&gt;`,在网页中呈现为斜体,以吸引用户的注意力。 实现步骤: 1. 创建索引:首先,使用Lucene的Analyzer(这里是IKAnalyzer)对文档内容进行分词,...

    解密搜索引擎技术实战:Lucene&Java精华版

    - **3.1.11 提取标题**:介绍了如何自动抽取网页的标题信息。 - **3.1.12 提取日期**:探讨了如何从网页中抽取日期信息。 - **3.2 从非HTML文件中提取文本**: - **3.2.1 提取标题的一般方法**:介绍了通用的标题...

    一个专业搜索公司关于lucene+solar资料(1)

    ### Lucene+Solor知识点概述 #### 一、搜索引擎基础理论 **1.1 Google神话** - **起源与发展:** - Google成立于1998年,由Larry Page和Sergey Brin创立。 - 初期以PageRank算法为核心,有效解决了当时互联网...

    搜索引擎Lucene简单入门.pdf

    3. **半结构化数据**:如XML和HTML文档,既有一定的结构也可以从中抽取纯文本。 全文检索主要用于处理非结构化数据,尤其是文本数据。在全文检索中,系统通过对文档中的词汇进行索引来提高搜索速度和准确性。 ####...

    Homework-4 作业补充1

    它可以方便地从HTML文档中抽取正文内容。虽然Boilerpipe在这里被使用,但在实际应用中,如果需要更精确的内容抽取,如特定元素的选择,推荐使用jsoup库,它的CSS选择器功能更强大。对于jsoup无法处理的情况,可以...

    网页消重算法(java)

    1. **内容提取**:从HTML文档中抽取纯文本内容,忽略HTML标签、样式和脚本等非文本元素。 2. **预处理**:对提取的文本进行标准化处理,如去除标点符号、数字、停用词,并进行词干提取或词形还原。 3. **特征表示**...

    网络爬虫系统

    开发Java网络爬虫时,可以利用Lucene进行网页内容的索引和快速检索: - Lucene的使用:理解索引的构建过程,包括分析文本、创建倒排索引等。 - 查询解析:学习如何将用户输入的查询字符串转化为Lucene可以识别的...

    search_engine_html_lunr.zip

    这个`search_engine_html_lunr.zip`文件包含了基于`lunr.js`构建的搜索解决方案,特别优化了对HTML文件的支持,从而能够帮助用户快速准确地在网页内容中查找所需信息。 **lunr.js 概述** `lunr.js` 是由Matt ...

    搭建自己的搜索引擎Java

    同时,Jsoup还支持CSS选择器,使数据抽取更加便捷。 3. **文本预处理**:在建立索引之前,需要对抓取的文本进行预处理,包括去除HTML标签、转换为小写、停用词过滤、词干提取等。这些步骤有助于减少噪声,提高搜索...

    基于Java的垂直搜索引擎的设计与实现.pdf

    索引器负责对抓取回来的网页进行预处理,包括去除HTML标签、提取关键词等,并将处理后的数据存储为索引文件;检索器则根据用户的查询请求,快速定位到相应的索引文件并返回结果。 ### 2. 垂直搜索引擎的特点与优势 ...

    Heritrix

    3. **内容解析与抽取**:Heritrix支持多种内容格式,如HTML、PDF、XML等,并能解析这些文件,提取出有用的信息,如文本内容、元数据等。 4. **链接管理**:Heritrix具备强大的链接管理和去重机制,确保不重复抓取同...

Global site tag (gtag.js) - Google Analytics