`
thrillerzw
  • 浏览: 143826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NekoHTML

 
阅读更多

遍历html,删除节点信息demo

//author: thrillerzw
public class DomUtils {


    public static Document parse(String str) {
	InputSource input = new InputSource(new StringReader(str));

	DOMParser parser = new DOMParser();

	try {
	    // parser.setFeature("http://cyberneko.org/html/features/override-namespaces",
	    // false);
	    parser.setFeature(
		    "http://cyberneko.org/html/features/balance-tags/ignore-outside-content",
		    true);
	    parser.setFeature(
		    "http://cyberneko.org/html/features/balance-tags/document-fragment",
		    false);

	    parser.setFeature(
		    "http://cyberneko.org/html/features/scanner/script/strip-comment-delims",
		    true);
	    parser.setFeature(
		    "http://cyberneko.org/html/features/scanner/script/strip-cdata-delims",
		    true);
	    parser.setFeature(
		    "http://cyberneko.org/html/features/scanner/style/strip-comment-delims",
		    true);
	    parser.setFeature(
		    "http://cyberneko.org/html/features/scanner/style/strip-cdata-delims",
		    true);
	    parser.setFeature(
		    "http://cyberneko.org/html/features/scanner/notify-builtin-refs",
		    true);

	    parser.setFeature(
		    "http://apache.org/xml/features/scanner/notify-char-refs",
		    true);
	    parser.setFeature(
		    "http://apache.org/xml/features/scanner/notify-builtin-refs",
		    true);

	} catch (SAXNotRecognizedException e1) {
	    e1.printStackTrace();
	} catch (SAXNotSupportedException e1) {
	    e1.printStackTrace();
	}

	try {

	    // 设置网页的默认编码
	    parser.setProperty(
		    "http://cyberneko.org/html/properties/default-encoding",
		    "utf-8");
	    // parser.parse(input);
	    parser.parse(str);

	    Document d = parser.getDocument();

	    return d;
	} catch (SAXException e) {
	    e.printStackTrace();
	} catch (IOException e) {
	    e.printStackTrace();
	}
	return null;
    }
    //<base target="_blank">
    public static String[] delNodes = { "SCRIPT", "STYLE", "OBJECT", "EMBED", "INPUT","SELECT","IFRAME","LINK","BASE","TITLE"};
    public static String[] clearAttrsNodes = { "BODY","HTML","STRONG", "EM", "OL", "UL", "DL","DT","DD","LI","SUB","SUP","BR","SPAN","H1","H2" };
    public static String[] transPNodes = { "CAPTION","DIV"};
    public static String[] transH2Nodes = { "H3","H4","H5","H6",};
  //  img: {$:{width:1,height:1,src:1,style:['float','width','height']}}    
    public static String[] imgAttrs = {"src","style"};
    private static boolean isDelNode(String nodeName){
	List<String> list=Arrays.asList(delNodes);
	boolean res=list.contains(nodeName);
	return res;
    }
    private static boolean isClearAttrsNode(String nodeName){
	List<String> list=Arrays.asList(clearAttrsNodes);
	boolean res=list.contains(nodeName);
	return res;
    }
    private static boolean isTransPNodes(String nodeName){
   	List<String> list=Arrays.asList(transPNodes);
   	boolean res=list.contains(nodeName);
   	return res;
     }
    private static boolean isTransH2Nodes(String nodeName){
	List<String> list=Arrays.asList(transH2Nodes);
	boolean res=list.contains(nodeName);
	return res;
    }
    private static boolean isImgAttrs(String nodeName){
	List<String> list=Arrays.asList(imgAttrs);
	boolean res=list.contains(nodeName.toLowerCase());
	return res;
    }
    private static void toHTML(StringBuilder sb, Node node,String path) {

	int type = node.getNodeType();
	switch (type) {

	case Node.DOCUMENT_NODE: {
	    NodeList children = node.getChildNodes();
	    if (children != null) {
		int len = children.getLength();
		for (int i = 0; i < len; i++)
		    toHTML(sb, children.item(i),path);
	    }
	    break;
	}

	// print element with attributes    
	case Node.ELEMENT_NODE: {
	    //节点名字都是大写
	    String nodeName=node.getNodeName();
	    if(isDelNode(nodeName)||(!nodeName.startsWith("P:")&&nodeName.contains(":"))){
		break;
	    }
	   
	    sb.append("<");
	    if(isTransPNodes(nodeName)||nodeName.startsWith("P:")){
		nodeName="P";
	    }else if("B".equals(nodeName)){
		nodeName="STRONG";
	    }
	    else if(isTransH2Nodes(nodeName)){
	       nodeName="H2";
	    }
	    else if("H2".equals(nodeName)){
		nodeName="H1";
	    }else if("NOBR".equals(nodeName)){
		nodeName="SPAN";
	    }
 
	    sb.append(nodeName);
	    
	   
	    if (!isClearAttrsNode(nodeName)) {
		NamedNodeMap attrs = node.getAttributes();
		for (int i = 0; i < attrs.getLength(); i++) {
		    Node attr = attrs.item(i);
		    String key = attr.getNodeName();
		    String value = attr.getNodeValue();
		    //a : clearStyle
		    if("A".equals(nodeName)&&"STYLE".equalsIgnoreCase(key)){
			continue;
		    }
		    //p: {$:{id:1,style:['text-align']}},
		    if("P".equals(nodeName)&&(!"id".equalsIgnoreCase(key)||!"style".equalsIgnoreCase(key))){
			continue;
		    }
		    if("P".equals(nodeName)&&"style".equalsIgnoreCase(key)){
			int p1=value.indexOf("text-align");
			if(p1!=-1){
			    int p2=value.indexOf(";", p1);
			    value=value.substring(p1, p2);
			}
		    }
		    //img: {$:{width:1,height:1,src:1,style:['float','width','height']}}
		    if("IMG".equals(nodeName)&&!isImgAttrs(key)){
			continue;
		    }
		    if("IMG".equals(nodeName)&&"src".equalsIgnoreCase(key)){
			value=path+value;
		    }
		    if("IMG".equals(nodeName)&&"style".equalsIgnoreCase(key)){
			String[] cssArr={"float","width","height"};
			StringBuffer cssSb=new StringBuffer();
			for(int j=0;j<cssArr.length;j++){
			    int p1=value.indexOf(cssArr[j]);
				if(p1!=-1){
				    int p2=value.indexOf(";", p1);
				    if(p2==-1){
					p2=value.length();
				    }
				    cssSb.append(value.substring(p1, p2)).append(";");
				}
			}
			value=cssSb.toString();
		    }
		    sb.append(" " + key + "=\"" + value + "\"");
		}
	    }
	    if (!node.hasChildNodes()) {
		
		if (!sb.toString().trim().endsWith("/>")) {
		    sb.append("/>");
		}
		return;
	    }
	    sb.append(">");

	    NodeList children = node.getChildNodes();
	    if (children != null) {
		int len = children.getLength();
		for (int i = 0; i < len; i++)
		    toHTML(sb, children.item(i),path);
	    }
	    break;
	}

	// handle entity reference nodes
	case Node.ENTITY_REFERENCE_NODE: {
	    sb.append("&").append(node.getNodeName()).append(";");
	    break;
	}

	// print cdata sections
/*	case Node.CDATA_SECTION_NODE: {
	    sb.append("<![CDATA[").append(node.getNodeValue()).append("]]>");
	    break;
	}*/

	// print text
	case Node.TEXT_NODE: {
	    String value=node.getNodeValue();
	    String name=node.getNodeName();
	    if(value.trim().startsWith("if(navigator")){
		value=value.replace("if(navigator.userAgent.indexOf('MSIE')<0) {", "").replace("}", "");
	    }
	    sb.append(value);
	    break;
	}
	
/*	case Node.COMMENT_NODE: {
	    String value=node.getNodeValue();
	    if(value.startsWith("[if !mso]>")){
		 sb.append("<!--").append(value).append("-->");
	    }
	   
	    break;
	}*/
	
	}

	if (type == Node.ELEMENT_NODE) {
	    String nodeName=node.getNodeName();
	    if (!isDelNode(nodeName)&&!(!nodeName.startsWith("P:")&&nodeName.contains(":"))) {
		   sb.append("</");
		   if(isTransPNodes(nodeName)||nodeName.startsWith("P:")){
			nodeName="P";
		    }else if("B".equals(nodeName)){
			nodeName="STRONG";
		    }
		    else if(isTransH2Nodes(nodeName)){
		       nodeName="H2";
		    }
		    else if("H2".equals(nodeName)){
			nodeName="H1";
		    }else if("NOBR".equals(nodeName)){
			nodeName="SPAN";
		    }
		sb.append(nodeName);
		sb.append(">");
	    }
	    
	}
    }

    /**
     * prase node to HTML
     * 
     * @param node
     * @return html string
     */
    public static String toHTML(Node node,String path) {
	StringBuilder sb = new StringBuilder();
	toHTML(sb, node,path);
	return sb.toString();
    }


    public static void main(String[] args) throws IOException {

	// 解析为dom节点
	Node node = DomUtils.parse("http://www.baidu.com");
//	Node node = DomTest.parse("D:\\tmp\\11pptx.files\\slide1.htm");
	//Node node = DomTest.parse("D:\\tmp\11pptx.files\\slide1.htm");
	System.out.println(DomUtils.toHTML(node,""));

    }
}

 

分享到:
评论

相关推荐

    NekoHtml解析 html 文件

    在深入探讨NekoHtml之前,我们需要理解什么是DOM。DOM是一种W3C标准,它提供了一种结构化的表示XML或HTML文档的方式,允许程序和脚本动态更新、添加、删除和改变元素和属性。通过构建DOM树,NekoHtml使得开发者能够...

    Nekohtml_0.9.5(Java).rar_Nekohtml_0.9.5_java 搜索引擎_nekoht_nekohtm

    在提供的压缩包中,`Nekohtml_0.9.5(Java)`可能包含NekoHTML的源代码,这对于开发者深入理解其工作原理和进行定制化开发非常有用。而`www.pudn.com.txt`可能是包含下载链接或介绍信息的文本文件,可以帮助用户了解更...

    nekohtml-1.9.13.zip

    这个"nekohtml-1.9.13.zip"压缩包包含的是NekoHTML的1.9.13版本,这是一个稳定且广泛使用的版本。 NekoHTML的核心是两个关键类:`org.cyberneko.html.parsers.DOMParser`和`net.sourceforge.nekodoc.NekoDoc`。`DOM...

    nekohtml-1.9.15.zip

    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学习笔记.doc

    NekoHTML 学习笔记 NekoHTML 是一个简单的 HTML 扫描器和标签补偿器,使得程序能解析 HTML 文档并用标准的 XML 接口来访问其中的信息。这个解析器能投扫描 HTML 文件并“修正”许多作者(人或机器)在编写 HTML ...

    NekoHTML的相关用法以及j代码包

    在这个主题中,我们将深入探讨NekoHTML的核心概念、用法以及相关的Java代码示例。 **核心概念** 1. **HTML解析**:NekoHTML使用了一个名为`org.htmlparser`的解析器,它能够解析不完整的HTML标签、缺失的闭合标签...

    nekohtml-1.9.14源码及jar包

    这个压缩包包含了nekohtml的核心组件,包括了jar包和源码两个部分,方便开发者进行学习、调试以及自定义扩展。 **nekohtml**是一个轻量级的解析器,主要功能是解析不标准的HTML或XHTML文档,将其转换为标准的DOM...

    NekoHTML学习笔记.rar

    NekoHTML是一个简单地HTML扫描器和标签补偿...NekoHTML能增补缺失的父元素、自动用结束标签关闭相应的元素,以及不匹配的内嵌元素标签。NekoHTML的开发使用了Xerces Native Interface (XNI),后者是Xerces2的实现基础。

    Java解析HTML之NekoHTML

    本篇文章将深入探讨NekoHTML的工作原理以及如何在Java中使用它。 NekoHTML是由Apache Software Foundation的Xerces项目开发的一个小型库,它提供了两个主要类:`org.htmlparser.Parser`和`org.htmlparser....

    NekoHtml 解析内容时需要注意的地方

    《NekoHtml解析内容时需要注意的地方》 在深入探讨NekoHtml解析内容的注意事项之前,首先需要理解NekoHtml是什么。NekoHtml是一款开源的HTML解析器,它由Apache Software Foundation旗下的Xerces项目开发,主要用于...

    NeKoHTML 1.9.21

    在使用NeKoHTML时,开发者需要将`nekohtml-1.9.21.jar`添加到项目的类路径中,以便能正确导入和使用NeKoHTML的类。同时,由于NeKoHTML依赖于`xercesImpl.jar`和`xml-apis.jar`,所以这两个库也需要一并包含在类路径...

    nekohtml+dom4j

    在这个组合中,nekohtml扮演着核心角色,而dom4j则提供了强大的DOM(Document Object Model)操作能力,同时支持XPath查询语言。 nekohtml是一个开源的Java库,它的主要功能是对不规范的HTML进行清理和补全,将其...

    nekoHtml 1.9.19 加 source 源码 html分析jar

    其次,如果遇到特定的解析问题或者需要扩展nekoHtml的功能,可以直接修改源码来满足需求。最后,源码可以帮助开发者快速定位并修复可能遇到的bug,提高应用的稳定性。 在使用nekoHtml时,开发者可以通过Java API...

    nekohtml-1.9.7.zip

    "nekohtml-1.9.7.zip" 是一个压缩包文件,其中包含了一个名为 "nekohtml-1.9.7" 的程序库。这个库主要用于处理HTML文档,为开发者提供了解析和构建HTML文档的功能。在IT行业中,处理HTML文档是网页开发、数据抓取、...

    NekoHTML技术

    NekoHTML技术预研说明,如何进行HTML页面解析,网页信息抽取

    html解析例子,用nekohtml写的

    `Neko.java`可能是另一个类,它封装了NekoHTML解析器的主要逻辑,提供了更方便的API供`Caipiao.java`调用。 在`README.txt`中,作者很可能详细解释了如何运行这些示例程序,包括必要的依赖和步骤。如果你遇到任何...

    nekohtml解析器

    NekoHTML是一个Java语言的 HTML扫描器和标签补全器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能够扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档 过程中常...

    nekohtml 帮助类

    这个帮助类可能指的是`nekohtml`库中的一些辅助类或方法,用于支持解析过程。 `NodeHelper.java` 和 `NekoHelper.java` 是可能包含在`nekohtml`库中的关键类。`NodeHelper`类很可能包含了一系列方法,用于操作和...

    nekohtml包能够解析HTML文件

    NekoHTML是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的...

Global site tag (gtag.js) - Google Analytics