使用NekoHtml处理网页(删除Style标签)

最近在做一个手机APP,通过一个新闻抓取程序抓取新闻,然后通过APP展示新闻。后发现手机端不支持Style标签,如果网页中有Style标签,则标签内的内容会显示处理非常影响页面美观。于是就写了一个用NekoHTML来清除Style标签的工具类

html.filter.properties 配置文件,配置允许的标签和要删除的标签及标签内的属性

attributes=style,id,name,class,width,height,src,oldsrc,complete,align,alt,title
acceptTags=div,span,a,li,ul,nav,br,p,img,font,b,strong,table,tr,td
removeTags=style

PropertiesUtils 读取Properties

package com.tiamaes.gjds.util;

import java.io.IOException;
import java.util.Properties;

import org.springframework.core.io.ClassPathResource;

/**
 * <p>类描述: 读取Properties中的属性 </p>
 * <p>创建人:王成委  </p>
 * <p>创建时间:2015年1月28日 上午11:23:27  </p>
 * <p>版权说明: © 2015 Tiamaes </p>
 */
public class PropertiesUtils {
	private Properties properties;

	public PropertiesUtils(String path){
		try {
			ClassPathResource resource = new ClassPathResource(path);
			properties = new Properties();
			properties.load(resource.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public String get(String key){
		return this.properties.getProperty(key);
	}

}

过滤HTML中的标签

package com.tiamaes.gjds.util;

import java.io.CharArrayReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import org.apache.xerces.xni.parser.XMLDocumentFilter;
import org.cyberneko.html.filters.ElementRemover;
import org.cyberneko.html.filters.Writer;
import org.cyberneko.html.parsers.DOMParser;
import org.xml.sax.InputSource;

/**
 * <p>类描述: 过滤Html中的标签 </p>
 * <p>创建人:王成委  </p>
 * <p>创建时间:2015年1月29日 上午10:45:02  </p>
 * <p>版权说明: © 2015 Tiamaes </p>
 */
public class HtmlFilterUtils {
	private static PropertiesUtils properties = null;
	private static HtmlFilterUtils filter = null;
	private String configPath = "html.filter.properties";
	private static final String ATTRIBUTE_FIELD = "attributes";
	private static final String ACCEPT_TAGS_FIELD = "acceptTags";
	private static final String REMOVE_TAGS_FIELD = "removeTags";

	private List<String> attributes = new ArrayList<String>();
	private List<String> acceptTags = new ArrayList<String>();
	private List<String> removeTags = new ArrayList<String>();

	private static synchronized void syncInit(){
		if(filter == null)
			filter = new HtmlFilterUtils();
	}

	public static HtmlFilterUtils getInstance(){
		return getInstance(false);
	}

	public static HtmlFilterUtils getInstance(boolean createNew){
		if(createNew)return new HtmlFilterUtils();
		if(filter == null){
			syncInit();
		}
		return filter;
	}

	private HtmlFilterUtils(){
		if(properties == null){
			properties = new PropertiesUtils(configPath);
		}
		this.addToList(attributes, properties.get(ATTRIBUTE_FIELD));
		this.addToList(acceptTags, properties.get(ACCEPT_TAGS_FIELD));
		this.addToList(removeTags, properties.get(REMOVE_TAGS_FIELD));
	}

	public void addAtributes(String attrName){
		this.attributes.add(attrName);
	}

	public void removeAtributes(String attrName){
		this.attributes.remove(attrName);
	}

	public void addRmoveTag(String tagName){
		this.removeTags.add(tagName);
	}
	public void removeRmoveTag(String tagName){
		this.removeTags.remove(tagName);
	}

	public void addAcceptTag(String tagName){
		this.acceptTags.add(tagName);
	}
	public void removeAcceptTag(String tagName){
		this.acceptTags.remove(tagName);
	}

	private void addToList(List<String> list,String sources){
		if(list == null) list = new ArrayList<String>();
		String[] sourcesArray = sources.split(",");
		for(String str:sourcesArray){
			list.add(str);
		}
	}

	public String doFilter(String htmlCode){
		ElementRemover remover = new ElementRemover();
		String[] atrrs = new String[attributes.size()];
		for(String tag : acceptTags)remover.acceptElement(tag,attributes.toArray(atrrs));
		for(String tag : removeTags)remover.removeElement(tag);

		CharArrayReader reader = null;
		String result;
		try {
			StringWriter filteredDescription = new StringWriter();
			Writer writer = new Writer(filteredDescription,"UTF-8");
			XMLDocumentFilter[] filters = {remover,writer};

			DOMParser parser = new DOMParser();
			reader = new CharArrayReader(htmlCode.toCharArray());
			InputSource inputSource = new InputSource(reader);
			parser.setProperty("http://cyberneko.org/html/properties/filters", filters);
			parser.parse(inputSource);
			result = filteredDescription.toString();
		} catch (Exception e1) {
			e1.printStackTrace();
			result =  htmlCode;
		}

		try {
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}
}

调用doFilter可以过滤HTML的内容

时间: 2024-10-21 22:22:47

使用NekoHtml处理网页(删除Style标签)的相关文章

写网页爬虫遇到标签匹配难题

写网页爬虫遇到标签匹配难题技术 maybe yes 发表于2015-02-02 13:22 原文链接 : http://blog.lmlphp.com/archives/78  来自 : LMLPHP后院 前段时间写优化网页节点的程序时,遇到了标签匹配的难题.在匹配图片标签时,由于标签里面的 JavaScript 代码中含有大于号">"导致无法匹配完整的标签内容.将这样的问题分享出来,不知道像百度啊他们的爬虫是如何处理这样的问题的.请看下面的代码: <!-- HTML DO

js点击图片删除子标签li

上图的效果图请看下面 点击图片部分会删除子标签li部分

总结php删除html标签和标签内的内容的方法

经常扒别人网站文章的坑们:我是指那种批量式采集的压根不看内容的,少不了都会用到删除html标签的函数:这里介绍3种不同用途上的方法: $str='<div><p>这里是p标签</p><img src="" alt="这里是img标签"><a href="">这里是a标签</a><br></div>'; 1:删除全部或者保留指定html标签 php自带的

javascript删除目标标签

<script> window.onload=function(){ var odiv=document.getElementById("content");  // 获取要删除的div 或什么的     对象 $("#bt").click(function(){     // 为按钮添加点击事件 odiv.parentNode.removeChild(odiv);    // 删除目标标签 }); } </script> </head

JS动态引入js,CSS——动态创建script/link/style标签

一.动态创建link方式 我们可以使用link的方式.如下代码所示. function addCssByLink(url){ var doc=document; var link=doc.createElement("link"); link.setAttribute("rel", "stylesheet"); link.setAttribute("type", "text/css"); link.setA

JS动态引入js、CSS动态创建script/link/style标签

一.动态创建link方式 我们可以使用link的方式.如下代码所示. function addCssByLink(url){ var doc=document; var link=doc.createElement("link"); link.setAttribute("rel", "stylesheet"); link.setAttribute("type", "text/css"); link.setA

Java过滤任意(script,html,style)标签符,返回纯文本--封装类

import java.util.regex.Pattern; /** * 过滤标签字符串,返回纯文本 * */ public class ChangePlainText { public static void main(String[] args) { String test="<b>hi</b></br><h1>hello~</h1><哈哈>"; String b=ChangePlainText.Html2T

漂亮的win8风格网页(Metro Style web)

漂亮的win8风格网页(Metro Style web)

JQuery删除html标签后面相邻的元素

JQuery删除html标签后面相邻的元素,如下: html代码 <input type="text" id="RE" /> <label>123abc</label> <input type="button" value="Remove" onclick="removeElement();" /> js代码: function removeElement()