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

htmlcleaner过滤HTML

    博客分类:
  • JAVA
阅读更多

曾经用HTMLParser过滤HTML, 但发现HTMLParser有时候对不规范的HTMl解析不了, 并且不支持xpath,

后来在Web-Harvest开源爬虫网站找到了HTMLParser,能够帮助我们将HTML 文档 转化为结构化的XML文档。虽然目前已经有了类似这样的工具,但是HtmlCleaner 能够完成几乎所有的HTML转换,而且不到30k,这是他们值得称道的地方。

 

1.HtmlCleaner的文档对象模型现在拥有了一些函数,处理节点和属性,所以现在在序列化之前搜索或者编辑是非常容易的。
2.提供基本 HtmlCleaner DOM的XPath支持

3. 解析后编程轻量级文档对象,能够很容易的被转换到DOM或者JDom标准文档,或者通过各种方式(压缩,打印)连续输出XML。

转换完成后, 能用JDOM,dom4j对文当进行处理

 

package com.citgee.webclip;

import org.htmlcleaner.*;

import java.net.*;
import java.io.*;
import java.util.*;

import org.jdom.*;
//import org.jdom.output.*;
import org.jdom.contrib.helpers.XPathHelper;
import org.jdom.filter.Filter;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;

public class WebClipUtils {
 
 public static Document getDocumentByURL(String url,String charset) throws MalformedURLException, IOException{
  HtmlCleaner htmlCleaner = new HtmlCleaner();
  CleanerProperties props = htmlCleaner.getProperties();
  TagNode node = htmlCleaner.clean(new URL(url),charset);
  JDomSerializer jdomSerializer = new JDomSerializer(props,true);
  Document doc = jdomSerializer.createJDom(node);
  return doc;
 }
 
 public static List<Element> getElementsByTagName(Document doc,String tagName){
  List<Element> eleList = new ArrayList<Element>();
  buildList(doc.getRootElement(),tagName,eleList);
  return eleList;
 }
 
 private static void buildList(Element rootEle,String tagName,List<Element> eleList){
  if(rootEle.getName().equals(tagName)){
   eleList.add(rootEle);
  }
  List list = rootEle.getChildren();
  for(Iterator iter = list.iterator();iter.hasNext();){
   Element ele = (Element)iter.next();
   buildList(ele,tagName,eleList);
  }
 }
 
 public static void printElement(Element ele) throws IOException{
  XMLOutputter outputer = new XMLOutputter();
  Format format = outputer.getFormat();
  format.setEncoding("GB2312");
  outputer.setFormat(format);
  outputer.output(ele, System.out);
 }
 
 
 public static void main(String[] args) throws Exception{
  HtmlCleaner htmlCleaner = new HtmlCleaner();
  
  CleanerProperties props = htmlCleaner.getProperties();
  
  
//  TagNode node = htmlCleaner.clean(new URL("http://www.baidu.com"));
  TagNode node = htmlCleaner.clean(new URL("http://www.huanqiu.com"),"UTF-8");
  
//  XmlSerializer xmlSerializer = new PrettyXmlSerializer(props);
//  StringWriter writer = new StringWriter();
//  xmlSerializer.writeXml(node, writer, "GB2312");
//  System.out.println(writer.toString());
  
  JDomSerializer jdomSerializer = new JDomSerializer(props,true);
  Document doc = jdomSerializer.createJDom(node);
  
  Element rootEle = doc.getRootElement();
  
  System.out.println(XPathHelper.getPathString(rootEle));
  final String tagName = "div";
  List list = getElementsByTagName(doc,"div");
  System.out.println(list.size());
  Iterator iter = list.iterator();
  while (iter.hasNext()) {
   Element ele = (Element) iter.next();
   System.out.println();
   System.out.println("*****************************************");
   System.out.println(XPathHelper.getPathString(ele));
   System.out.println("*****************************************");
   printElement(ele);
  }
  

  
 }
}









public class HtmlClean {  
  
    public void cleanHtml(String htmlurl, String xmlurl) {  
        try {  
            long start = System.currentTimeMillis();  
  
            HtmlCleaner cleaner = new HtmlCleaner();  
            CleanerProperties props = cleaner.getProperties();  
            props.setUseCdataForScriptAndStyle(true);  
            props.setRecognizeUnicodeChars(true);  
            props.setUseEmptyElementTags(true);  
            props.setAdvancedXmlEscape(true);  
            props.setTranslateSpecialEntities(true);  
            props.setBooleanAttributeValues("empty");  
  
            TagNode node = cleaner.clean(new File(htmlurl));  
  
            System.out.println("vreme:" + (System.currentTimeMillis() - start));  
  
            new PrettyXmlSerializer(props).writeXmlToFile(node, xmlurl);  
  
            System.out.println("vreme:" + (System.currentTimeMillis() - start));  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  
  
8
0
分享到:
评论
6 楼 SE_XiaoFeng 2013-04-15  
看的我是晕晕乎乎的。
5 楼 tianhewulei 2010-04-15  
NEKOHTML其实也不错...
4 楼 eimhee 2010-04-15  
xiaoyiz 写道
我觉得你没必要。。。htmlcleaner本身就支持xpath来查找。。在用jdom dom4j sax之类的再进行解析感觉多此一举了。。。

例如:查找一个<div class='weatherYubaoBox'><p>其他N多节点</p></div>
Object[] weatherBoxInfoObjects = node.evaluateXPath("//div[@class='weatherYubaoBox']//table");


htmlcleaner支持xpath的功能不全
3 楼 xiaoyiz 2010-04-14  
我觉得你没必要。。。htmlcleaner本身就支持xpath来查找。。在用jdom dom4j sax之类的再进行解析感觉多此一举了。。。

例如:查找一个<div class='weatherYubaoBox'><p>其他N多节点</p></div>
Object[] weatherBoxInfoObjects = node.evaluateXPath("//div[@class='weatherYubaoBox']//table");

2 楼 whaosoft 2010-04-12  
这个很好 用吗?
1 楼 sdh5724 2010-04-04  
性能如何, 每秒能处理几M HTML?

相关推荐

    HtmlCleaner

    HtmlCleaner是一个开源的Java语言的Html文档解析器。 HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则...

    HTMLcleaner

    5. **安全的HTML过滤**:对于需要展示用户生成内容的场景,HTMLcleaner可以作为一个安全的过滤器,防止XSS(跨站脚本攻击)的发生。它可以移除潜在危险的标签和属性,比如`&lt;script&gt;`和`&lt;iframe&gt;`,从而保护应用免受...

    网页解析工具HTMLCleaner

    HTMLCleaner允许用户对HTML文档进行深度定制,通过去除不必要的标签或向页面中添加新的元素,从而实现对网页内容的个性化处理。这对于网页抓取、数据挖掘以及自动化测试等场景非常有用。例如,你可以使用HTMLCleaner...

    htmlcleaner-2.22_html_XSS_

    HTMLCleaner是一款强大的HTML清理和过滤工具,主要目的是在处理用户输入的HTML内容时,过滤掉不安全的字符和元素,防止跨站脚本(XSS)攻击。XSS攻击是一种常见的网络安全问题,通过注入恶意脚本到网页,攻击者可以...

    htmlcleaner

    3. **标签和属性过滤**:通过配置自定义的规则,HTMLCleaner可以允许或禁止特定的HTML标签和属性。这在防止XSS(Cross-Site Scripting)攻击或限制可接受的HTML内容时非常有用。 4. **DOM操作**:解析后的HTML会被...

    HtmlCleaner使用说明文档

    HtmlCleaner提供了丰富的配置选项,允许用户根据实际需求进行定制化的清理工作,比如设置字符编码、转换属性格式、过滤标签或属性等。这些高级功能为开发者提供了便利,使得HTML的清理工作能够更加精细和高效。 在...

    页面正文提取htmlcleaner-2.8.jar

    1. **HTML清理与标准化**:HtmlCleaner通过解析HTML文档并将其转换为干净的DOM(文档对象模型)树,可以去除广告、脚本、样式表等非正文内容,同时修复不规范的HTML标签,使文档结构更加规整。 2. **标签过滤与替换...

    htmlcleaner使用方法及xpath语法初探

    HtmlCleaner遵循大部分Web浏览器构建DOM时的规则,但同时也允许用户自定义标签和规则集以适应特定的过滤和匹配需求。 【XPath简介】 XPath(XML Path Language)是一种在XML文档中查找信息的语言,用于选取XML文档...

    HtmlCleaner-开源

    HtmlCleaner的优势在于它提供了一种简单且可配置的方式来处理HTML内容,这对于网页抓取、数据提取、内容过滤等应用场景非常有用。同时,由于它是开源的,用户可以根据需要调整和扩展其功能,满足特定需求。例如,...

    HtmlCleanerv2.13Html文档解析器

    HtmlCleaner是一个开源的Java语言的Html文档解析器。HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则。...

    XpathDemo.zip

    HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则。然而,用户可以提供自定义tag和规则组来进行过滤和...

    htmlclean.jar

    `htmlclean.jar` 是一个专门设计用于过滤和清理 HTML 代码的工具包,它可以帮助开发者从文本中移除不必要的 HTML 标签,使得内容更加纯净,便于后续处理。这个工具包包含了一个名为 `htmlcleaner-2.10.jar` 的库文件...

    Python库 | verto-0.5.2-py3-none-any.whl

    1. **文本过滤**:提供去除HTML标签、特殊字符和停用词等功能,以便在处理文本数据时减少噪声。 2. **标记化**:将连续的文本分割成可操作的单词或短语,这对于词汇分析和自然语言处理(NLP)任务至关重要。 3. **...

    k9mail安卓邮箱客户端源代码

    `HTMLCLEANER_LICENSE`可能涉及到项目中使用的HTML清理库的授权信息,确保合规使用第三方组件。 6. **学习与贡献** 对于希望深入了解Android邮件应用开发的开发者来说,K9mail源代码提供了丰富的学习资源。通过...

Global site tag (gtag.js) - Google Analytics