- 浏览: 441458 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (77)
- SERVLET (1)
- APP SERVER (3)
- MAVEN (2)
- IDE (0)
- JS (10)
- OTHER (4)
- CSS (1)
- DB (5)
- HIBERNATE (7)
- SPRING (4)
- ECLIPSE (5)
- STRUTS (1)
- ANNOTATION (3)
- SEARCH (11)
- HTML (2)
- HTTP (1)
- SYSTEM (3)
- JVM (12)
- JAVA (6)
- 算法 (0)
- TEST (1)
- 常用问题 (1)
- android (2)
- hadoop (1)
- NOSQL (1)
- 好文章 (0)
- LINUX (0)
- 临时 (0)
- Hbase (0)
- JS正则 (1)
最新评论
-
king_qing:
xinzhi_3600 写道u013275927 写道大哥,你 ...
注解@PostConstruct与@PreDestroy -
superLinux:
可以了,按照3楼的修改下就可以了
Eclipse is running in a JRE, but a JDK is required 解决方法 -
whg333:
zy315351965 写道请你验证以后再发出来,不要浪费宝贵 ...
Eclipse is running in a JRE, but a JDK is required 解决方法 -
zy315351965:
请你验证以后再发出来,不要浪费宝贵的时间
Eclipse is running in a JRE, but a JDK is required 解决方法 -
xinzhi_3600:
u013275927 写道大哥,你这错误挂了三年,得影响多少人 ...
注解@PostConstruct与@PreDestroy
NekoHTML 学习笔记
J. Andrew Clark
用Java写了一系列的工具
(Java APIs),NekoHTML
是其中之一。
NekoHTML
是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的错误。NekoHTML
能增补缺失的父元素、自动用结束标签关闭相应的元素,以及不匹配的内嵌元素标签。NekoHTML
的开发使用了Xerces Native Interface (XNI),后者是Xerces2的实现基础。
一、运行要求
从NekoHTML
主页上下载nekohtml
-latest.zip,目前版本是0.8.
NekoHTML
要求运行在java1.1或更高版本,Xerces-J 2.0或更高版本。(我在试用时,随便拿了个xerces的包来用,结果例如运行老时不能通过,折腾半天后才发现版本不够所致.:)
二、使用NekoHTML
1、透明地创建HTML解析器
利用Xerces2.0为基础,应用程序通过JAXP实例化解析器对象时,可以透明地创建HTML解析器,此时只需要将NekoHTML
的
jar文件,在CLASSPATH中放在Xerces的jar文件之前即可。nekohtmlXni.jar中的META-INF/services
/org.apache.xerces.xni.parser.XMLParserConfiguration文件会被Xerces的读取并取代标准的设
置文件,此处org.apache.xerces.xni.parser.XMLParserConfiguration文件的内容就是一个字符串
“org.cyberneko.html.HTMLConfiguration”。这种方法的好处是简单透明,缺点是影响了Xerces在其它情况下的使
用。
2、便利的HTML解析器类
要想避免上述的问题,可以使用org.cyberneko.html.parsers包的DOM和SAX解
析器类来创建解析器,这两个类都使用了HTMLConfiguration类。解析器一旦创建之后,就可以解析HTML文件,并用标准的XML接口来访问
文件中的信息,就象面对的是一个XML文件一样。
下面的代码是NekoHTML
自带的例程,我改了一下,使其可以显示HTML文件内容,而不显示类的名字。
package sample;import org.cyberneko.html.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Node;
public class TestHTMLDOM { public static void main(String[] argv) throws Exception { DOMParser parser = new DOMParser(); for (int i = 0; i < argv.length; i++) { parser.parse(argv[i]); print(parser.getDocument(), ""); } } public static void print(Node node, String indent) { // System.out.println(indent+node.getClass().getName()); if (node.getNodeValue() != null){ if("".equals(node.getNodeValue().trim())){ }else{ System.out.print(indent); System.out.println(node.getNodeValue()); } } Node child = node.getFirstChild(); while (child != null) { print(child, indent+" "); child = child.getNextSibling(); } } }
编译运行如下:
cp build_html.xml build.xml
ant
java -cp nekohtml .jar;nekohtmlSamples.jar;xmlParserAPIs.jar;xercesImpl.jar sample.TestHTMLDOM test.html
如果一切正常可以显示HTML的内容了。
3、文档
片段解析
除了DOM和SAX类,NekoHTML
还
提供了一个实验性质的DOMFragmentParser类,用以解析HTML文件的片段。我个人认为,由于浏览器的强大的容错能力,即使一个片段的
HTML文件,也可以正确显示,由此也变相地造成了很多人不再关心的HTML的完整要求了。这个类,也许将是用的最多的。下面,看看nutch是如何使用nekoHTML
的。
package net.nutch.fetcher; ... import org.cyberneko.html.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; import org.w3c.dom.html.*; import org.apache.html.dom.*;/* A simple fetcher. */ public class Fetcher { .... private DOMFragmentParser parser = new DOMFragmentParser(); .... private void handleFetch(URL url, FetchListEntry fle, Http.Response response) throws IOException, SAXException { //判断HTTP应答包的类型,只放过html文件 String contentType = response.getHeader("Content-Type"); if (contentType != null && !contentType.startsWith("text/html")) throw new IOException("Unknown content-type: " + contentType); //创建文件片段对象 DocumentFragment node = new HTMLDocumentImpl().createDocumentFragment(); //解析HTML内容 parser.parse(new InputSource(new ByteArrayInputStream(response.getContent())),node); //取得全部文本内容 StringBuffer sb = new StringBuffer(); getText(sb, node); String text = sb.toString(); //取得标题信息 sb.setLength(0); getTitle(sb, node); String title = sb.toString().trim(); //取得该页所有的出链 ArrayList l = new ArrayList(); getOutlinks(url, l, node); //显示结果,存储信息 Outlink[] outlinks = (Outlink[])l.toArray(new Outlink[l.size()]); LOG.fine("found " + outlinks.length + " outlinks in " + url);
outputPage(new FetcherOutput(fle, MD5Hash.digest(response.getContent()), true, title, outlinks), new FetcherContent(response.getContent()), new FetcherText(text)); } private static void getText(StringBuffer sb, Node node) { if (node.getNodeType() == Node.TEXT_NODE) { 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));//递归遍历DOM树 } } }
private static boolean getTitle(StringBuffer sb, Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) { if ("title".equalsIgnoreCase(node.getNodeName())) { getText(sb, node); return true; } } NodeList children = node.getChildNodes(); if (children != null) { int len = children.getLength(); for (int i = 0; i < len; i++) { if (getTitle(sb, children.item(i))) { return true; } } } return false; }
private static void getOutlinks(URL base, ArrayList outlinks, Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) { if ("a".equalsIgnoreCase(node.getNodeName())) { StringBuffer linkText = new StringBuffer(); getText(linkText, node);
NamedNodeMap attrs = node.getAttributes(); String target= null; for (int i= 0; i < attrs.getLength(); i++ ) { if ("href".equalsIgnoreCase(attrs.item(i).getNodeName())) { target= attrs.item(i).getNodeValue();//在DOM树中,属性是一个结点。 break; } } if (target != null) try { URL url = new URL(base, target); outlinks.add(new Outlink(url.toString(),linkText.toString().trim())); } catch (MalformedURLException e) { // don't care } } } NodeList children = node.getChildNodes(); if ( children != null ) { int len = children.getLength(); for ( int i = 0; i < len; i++ ) { getOutlinks(base, outlinks, children.item(i));//递归遍历DOM树 } } } .... }
注意,此处传递给解析过程parse的文档片段对象,必须是由org.w3c.dom.html.HTMLDocument类型的DOM文档对象创建,否则有异常。
HTMLConfiguration可以用于创建任何基于XNI解析器,可参考下例
package sample;import org.apache.xerces.parsers.AbstractSAXParser; import org.cyberneko.html.HTMLConfiguration;
public class HTMLSAXParser extends AbstractSAXParser { public HTMLSAXParser() { super(new HTMLConfiguration()); } }
三、设置解析器参数
为了更加精确的控制解析的动作,nekohtml 提供了相应的设置函数。如下列:
// settings on HTMLConfiguration org.apache.xerces.xni.parser.XMLParserConfiguration config = new org.cyberneko.html.HTMLConfiguration(); config.setFeature("http://cyberneko.org/html/features/augmentations", true); config.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");// settings on DOMParser org.cyberneko.html.parsers.DOMParser parser = new org.cyberneko.html.parsers.DOMParser(); parser.setFeature("http://cyberneko.org/html/features/augmentations", true); parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");
nekohtml 功能(feature)列表
功能 | 默认值 | 描述 |
http://cyberneko.org/html/features/balance-tags | True | 是否允许增补缺失的标签。如果要以XML方式操作HTML文件,此值必须为真。此处提供设置功能,为了性能的原因。 |
http://cyberneko.org/html/features/balance-tags/ignore-outside-content | False | 是否忽略文档根元素以后的数据。如果为false,<html>和<bod>被忽略,所有的内容都被解析。 |
http://cyberneko.org/html/features/document-fragment | False | 解析HTML片段时是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。 |
http://apache.org/xml/features/scanner/notify-char-refs | False | 当遇到字符实体引用(如&#x20;)是否将(#x20)报告给相应地文档处理器。 |
http://apache.org/xml/features/scanner/notify-builtin-refs | False | 当遇到XML内建的字符实体引用(如&amp;)是否将(amp)报告给相应地文档处理器。 |
http://cyberneko.org/html/features/scanner/notify-builtin-refs | False | 当遇到HTML内建的字符实体引用(如&copy;)是否将(copy)报告给相应地文档处理器。 |
http://cyberneko.org/html/features/scanner/script/strip-comment-delims | False | 是否剥掉<script>元素中的<!-- -->等注释符。 |
http://cyberneko.org/html/features/augmentations | False | 是否将与HTML事件有关的infoset项包括在解析管道中。 |
http://cyberneko.org/html/features/report-errors | False | 是否报告错误。 |
nekohtml 属性列表
属性 | 默认值 | 值域 | 描述 |
http://cyberneko.org/html/properties/filters | null | XMLDocumentFilter[] | 在解析管道的最后按数组顺序追加自定义的处理组件(过滤器),必须为数组类型。 |
http://cyberneko.org/html/properties/default-encoding | Windows-1252 | IANA encoding names | 默认的HTML文件编码 |
http://cyberneko.org/html/properties/names/elems | upper | upper,lower,match | 如果整理识别出的元素名称 |
http://cyberneko.org/html/properties/names/attrs | lower | upper,lower,no-change | 如果整理识别出的属性名称 |
四、管道过滤器
Xerces Native Interface (XNI)定义了一个解析器配置框架,在那儿一个个解析器以模块化组件的形式组成一个管道。这样一来,通过重新安排已有组件和/或新定制开发的组件,就可完成一个新的解析器配置工作。由于nekohtml
是采用这个配置框架开发的,所以对解析器新增功能就很简单通过在默认的nekohtml
解析管道的末端增加文档过滤器来实现。
要新开发一个过滤器,很简单地实现xerces2的org.apache.xerces.xni.parser包中的XMLDocumentFilter接口即可。这个接口,一方面使组件成为管道中上一级的事件处理器,另一方面又成为下级的信息源。针对nekohtml
的过滤器开发,只需简单地扩展org.cyberneko.html.filters包中的DefaultFilter类即可。
将自行开发的过滤器加入管道,可参考以下两种办法:
XMLDocumentFilter noop = new DefaultFilter(); XMLDocumentFilter[] filters = { noop };XMLParserConfiguration parser = new HTMLConfiguration(); parser.setProperty("http://cyberneko.org/html/properties/filters", filters);
nekohtml
的org.cyberneko.html.filters 包中有DefaultFilter、
ElementRemover、Identity、Writer,能实现动态插入内容、删除元素、序列化HTML文档等,不详细述。
发表评论
-
学习Solr不错的系列文章
2013-03-23 21:24 0学习Solr不错的系列文章 1)Solr 3.5 配置及应 ... -
最短编辑距离算法
2011-11-30 14:54 0最短编辑距离算法,在搜索引擎开发中应用很多,比如相关词等 还 ... -
Java 6 JVM参数选项大全(中文版)
2011-10-24 10:45 1297Java 6 JVM 参数选项大全(中文版) ... -
MyEclipse 7.5 设置
2011-10-20 11:00 0这几天启动MyEclipse7.5 ... -
Dynamic Code Evolution for Java dcevm 原理
2011-10-20 10:46 0在hostswap dcevm 中我们对Dynamic ... -
hostswap dcevm
2011-10-20 10:40 0什么是dcevm dcevm(DynamicC ... -
classLoader卸载与jvm热部署
2011-10-20 10:38 0以下的相关介绍都是在未使用dcevm的情况 classLoa ... -
HotSpot VM GC 的种类
2011-10-21 09:40 988collector种类 GC在 HotSpot ... -
JVM系列五:JVM监测&工具
2011-10-21 09:40 1163前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环 ... -
JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
2011-10-21 09:40 1140java application项目(非web项目) 改进前 ... -
JVM系列三:JVM参数设置、分析
2011-10-20 10:34 0<p>不管是YGC还是Full GC,GC过程中都 ... -
JVM系列二:GC策略&内存申请、对象衰老
2011-10-20 10:32 1088JVM里的GC(Garbage Collection) ... -
JVM系列一:JVM内存组成及分配
2011-10-20 10:30 973java内存组成介绍:堆(Heap)和非堆(Non-hea ... -
JVM内存的调优
2011-10-20 10:29 2922一 .JVM 内存 的设置的原理 ... -
Java虚拟机(JVM)中的内存设置详解
2011-10-20 10:28 1044在一些规模稍大的应 ... -
JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
2011-10-20 10:27 1115java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根 ... -
html中header的内容
2011-10-13 18:21 4161<!DOCTYPE HTML PUBLIC " ...
相关推荐
NekoHTML 学习笔记 NekoHTML 是一个简单的 HTML 扫描器和标签补偿器,使得程序能解析 HTML 文档并用标准的 XML 接口来访问其中的信息。这个解析器能投扫描 HTML 文件并“修正”许多作者(人或机器)在编写 HTML ...
NekoHTML是一个简单地HTML扫描器和标签补偿...NekoHTML能增补缺失的父元素、自动用结束标签关闭相应的元素,以及不匹配的内嵌元素标签。NekoHTML的开发使用了Xerces Native Interface (XNI),后者是Xerces2的实现基础。
### NekoHTML 使用笔记 #### 一、简介与配置 NekoHTML 是一款轻量级且高效的 HTML 解析器库,它可以将不规范的 HTML 文档解析为接近标准的 XML 结构,便于后续处理和分析。该库尤其适用于对性能有较高要求的应用...
学习NekoHTML,你需要掌握以下几个关键概念: 1. **HTML解析**:理解HTML解析的基本原理,包括如何处理标签嵌套、属性、注释以及实体引用。 2. **DOM模型**:熟悉DOM的节点类型(元素节点、文本节点、属性节点等),...
NekoHtml是一个开源的、Java实现的...学习和掌握如何使用NekoHtml,可以帮助开发者更有效地解析和操作HTML文档,提升工作效率。同时,通过研究提供的"ParseHtmlFiles",可以加深对NekoHtml工作原理和实际应用的理解。
这个"nekohtml-1.9.13.zip"压缩包包含的是NekoHTML的1.9.13版本,这是一个稳定且广泛使用的版本。 NekoHTML的核心是两个关键类:`org.cyberneko.html.parsers.DOMParser`和`net.sourceforge.nekodoc.NekoDoc`。`DOM...
NekoHTML is written using the Xerces Native Interface (XNI) that is the foundation of the Xerces2 implementation. This enables you to use the NekoHTML parser with existing XNI tools without ...
NekoHTML是一个开源的Java库,主要用于解析HTML和XML文档,尤其在处理不规范或半结构化的HTML时...通过学习和使用NekoHTML,开发者可以提高解析效率,确保解析结果的准确性和一致性,同时增强系统的安全性和可扩展性。
NekoHTML技术预研说明,如何进行HTML页面解析,网页信息抽取
本篇文章将深入探讨NekoHTML的工作原理以及如何在Java中使用它。 NekoHTML是由Apache Software Foundation的Xerces项目开发的一个小型库,它提供了两个主要类:`org.htmlparser.Parser`和`org.htmlparser....
这个压缩包包含了nekohtml的核心组件,包括了jar包和源码两个部分,方便开发者进行学习、调试以及自定义扩展。 **nekohtml**是一个轻量级的解析器,主要功能是解析不标准的HTML或XHTML文档,将其转换为标准的DOM...
在这个主题中,我们将深入探讨NekoHTML的核心概念、用法以及相关的Java代码示例。 **核心概念** 1. **HTML解析**:NekoHTML使用了一个名为`org.htmlparser`的解析器,它能够解析不完整的HTML标签、缺失的闭合标签...
《NekoHtml解析内容时需要注意的地方》 在深入探讨NekoHtml解析内容的注意事项之前,首先需要理解NekoHtml是什么。NekoHtml是一款开源的HTML解析器,它由Apache Software Foundation旗下的Xerces项目开发,主要用于...
在使用NeKoHTML时,开发者需要将`nekohtml-1.9.21.jar`添加到项目的类路径中,以便能正确导入和使用NeKoHTML的类。同时,由于NeKoHTML依赖于`xercesImpl.jar`和`xml-apis.jar`,所以这两个库也需要一并包含在类路径...
NekoHTML是一个Java语言的 HTML扫描器和标签补全器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能够扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档 过程中常...
这个帮助类可能指的是`nekohtml`库中的一些辅助类或方法,用于支持解析过程。 `NodeHelper.java` 和 `NekoHelper.java` 是可能包含在`nekohtml`库中的关键类。`NodeHelper`类很可能包含了一系列方法,用于操作和...
"nekohtml-1.9.7.zip" 是一个压缩包文件,其中包含了一个名为 "nekohtml-1.9.7" 的程序库。这个库主要用于处理HTML文档,为开发者提供了解析和构建HTML文档的功能。在IT行业中,处理HTML文档是网页开发、数据抓取、...
在这个组合中,nekohtml扮演着核心角色,而dom4j则提供了强大的DOM(Document Object Model)操作能力,同时支持XPath查询语言。 nekohtml是一个开源的Java库,它的主要功能是对不规范的HTML进行清理和补全,将其...
nekohtml.jar nekohtmlSamples.jar