- 浏览: 285287 次
- 性别:
- 来自: 湖南
文章分类
- 全部博客 (120)
- Struts 1.框架 (12)
- Spring框架 (9)
- hibernate框架 (6)
- web 综合 (15)
- Dwr (1)
- struts 2 (19)
- 设计模式 (0)
- lucene (6)
- oracle (3)
- linux (10)
- mysql (4)
- jquery (0)
- AJAX (1)
- javaScript (1)
- J2SE (4)
- IBATIS (3)
- JPA (1)
- Compass (3)
- 报表 (1)
- 任务调度 (1)
- tomcat (3)
- RMI (0)
- JMS (2)
- WebService (2)
- SOAP (0)
- XML (1)
- 多线程 (8)
- 缓存 (2)
- nginx (3)
- mongodb (1)
- ant打包 (0)
最新评论
-
iceman1952:
Hi 你觉得很好的那两三篇 百度文库的链接,能贴一下吗?
内网穿透&UDP打洞 -
ice86rain:
里面貌似没有用到Lucene
Struts2+Hibernate3.2+Spring2.5+Compass整合 -
sgq0085:
写得非常详细 好文章
JMS之ActiveMQ Linux下安装与应用实例 -
強顔歓笶:
JMS之ActiveMQ Linux下安装与应用实例 -
yixiandave:
forcer521 写道不指定所有子目录都在一起的话,这样用源 ...
linux下nginx稳定版1.6.2安装
要解析html页面 就要对html中的标签做处理
先准备几个工具类
接下来看看如何解析html页面
加入htmlparser.jar包
现在可以成功的把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(" ", "") .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(" ", "") .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(" ", "") .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入门到项目开发
2010-10-10 15:53 3348加入jar包 lucene-core-2.4.0.jar ... -
lucene根据文件类型自动解析的工厂类
2010-10-10 15:22 1436阅读本章之前 请先参考其他几篇解析各类文档的章节 http: ... -
lucene如何解析Doc文档
2010-10-10 15:11 1746加入poi-scratchpad-3.0.2-FINAL-20 ... -
lucene如何解析pdf文档
2010-10-10 15:04 2461XPDF使用文档 XPDF版本 3.0.2 日期 2008-1 ... -
lucene如何解析PPT文档
2010-10-10 14:52 2329加入jar包(poi-3.0.2-FINAL-20080204 ...
相关推荐
这一步可以使用Jsoup或者其他HTML解析库完成,将HTML文本转换成结构化的数据,例如将歌曲名、歌手名等信息抽取出来,并保存为本地的TXT文件,或者直接存储到数据库中,如MySQL或MongoDB,便于后续操作。 接下来是...
在.NET中,可以使用HtmlAgilityPack或AngleSharp等库来解析和操作HTML文档,便于数据抽取。 接下来,我们将讨论如何使用Redis缓存数据库作为中间件。Redis是一个开源的、高性能的键值存储系统,特别适合用于数据...
1. **数据流集成**:Heritrix爬取的网页内容可以被直接送入Lucene进行索引,实现对互联网内容的实时搜索。 2. **深度搜索**:结合Heritrix的爬虫能力,Lucene的搜索引擎可以对互联网上的大量数据进行深度搜索,提高...
抓取到的网页数据通常是非结构化的HTML文档,需要通过网页信息抽取技术将其转换为结构化的数据。这一过程涉及对HTML文档的解析、内容识别以及信息抽取。在新闻垂直搜索引擎的场景下,这一步骤主要包括提取新闻标题、...
这一步骤通常涉及HTML解析和自然语言处理技术,目的是将非结构化的网页文本转换为结构化数据,便于后续的索引和查询。 ##### 3. 中文分词 中文分词是中文信息处理的关键步骤,对于建立有效的中文搜索索引至关重要...
这部分源代码涉及到HTML解析和内容抽取。 通过深入研究这两个项目的源代码,开发者不仅可以理解它们的基本工作原理,还可以学习如何将它们整合到自己的项目中,实现更高效的全文搜索和网络数据抓取。这对于构建大...
3. HTMLFormatter用于将高亮的关键词包裹在特定的HTML标签中,如`<em>`,在网页中呈现为斜体,以吸引用户的注意力。 实现步骤: 1. 创建索引:首先,使用Lucene的Analyzer(这里是IKAnalyzer)对文档内容进行分词,...
- **3.1.11 提取标题**:介绍了如何自动抽取网页的标题信息。 - **3.1.12 提取日期**:探讨了如何从网页中抽取日期信息。 - **3.2 从非HTML文件中提取文本**: - **3.2.1 提取标题的一般方法**:介绍了通用的标题...
### Lucene+Solor知识点概述 #### 一、搜索引擎基础理论 **1.1 Google神话** - **起源与发展:** - Google成立于1998年,由Larry Page和Sergey Brin创立。 - 初期以PageRank算法为核心,有效解决了当时互联网...
3. **半结构化数据**:如XML和HTML文档,既有一定的结构也可以从中抽取纯文本。 全文检索主要用于处理非结构化数据,尤其是文本数据。在全文检索中,系统通过对文档中的词汇进行索引来提高搜索速度和准确性。 ####...
它可以方便地从HTML文档中抽取正文内容。虽然Boilerpipe在这里被使用,但在实际应用中,如果需要更精确的内容抽取,如特定元素的选择,推荐使用jsoup库,它的CSS选择器功能更强大。对于jsoup无法处理的情况,可以...
1. **内容提取**:从HTML文档中抽取纯文本内容,忽略HTML标签、样式和脚本等非文本元素。 2. **预处理**:对提取的文本进行标准化处理,如去除标点符号、数字、停用词,并进行词干提取或词形还原。 3. **特征表示**...
开发Java网络爬虫时,可以利用Lucene进行网页内容的索引和快速检索: - Lucene的使用:理解索引的构建过程,包括分析文本、创建倒排索引等。 - 查询解析:学习如何将用户输入的查询字符串转化为Lucene可以识别的...
这个`search_engine_html_lunr.zip`文件包含了基于`lunr.js`构建的搜索解决方案,特别优化了对HTML文件的支持,从而能够帮助用户快速准确地在网页内容中查找所需信息。 **lunr.js 概述** `lunr.js` 是由Matt ...
同时,Jsoup还支持CSS选择器,使数据抽取更加便捷。 3. **文本预处理**:在建立索引之前,需要对抓取的文本进行预处理,包括去除HTML标签、转换为小写、停用词过滤、词干提取等。这些步骤有助于减少噪声,提高搜索...
索引器负责对抓取回来的网页进行预处理,包括去除HTML标签、提取关键词等,并将处理后的数据存储为索引文件;检索器则根据用户的查询请求,快速定位到相应的索引文件并返回结果。 ### 2. 垂直搜索引擎的特点与优势 ...
3. **内容解析与抽取**:Heritrix支持多种内容格式,如HTML、PDF、XML等,并能解析这些文件,提取出有用的信息,如文本内容、元数据等。 4. **链接管理**:Heritrix具备强大的链接管理和去重机制,确保不重复抓取同...