`

htmlparser中自定义html标签进行解析

 
阅读更多

原文出处:http://www.mzone.cc/article/270.html

   htmlparser是一个基于java的用来解析html页面的开源组件,可以很方便对html页面进行标签分析、动态修改、删除特定的html标签等。但有些时候,我们可能需要自定义非HTML标签实现一些额外的功能,比如我经常使用htmlparser解析并处理页面后需要返回最终的处理结果,一般情况下我们获取html这个根标签,然后toHtml()就可以得到了。但如果页面本身就不规范,没有或包含多个html根标签呢?这样就会出现数据遗漏的情况,我这里就来讲下我的处理过程:

1、自定义一个根标签

2、将解析到的HTML内容使用根标签进行包裹

3、再使用htmlparser解析包裹的结果字符串并处理

4、获取自定义的根标签并返回标签内部的内容

5、输出最终的自定义标签的内部内容即可完整输出

      首先,我们定义一个我们自己的html标签,在htmlparser中自定义标签需要继承CompositeTag类,该类非常简单,只需要覆写基类的getIds方法即可,如下:

package cc.mzone.html; 
import org.htmlparser.tags.CompositeTag; 
/**
 * 基于HtmlParser的全局顶层容器定义,包装所有的HTML内容。
 *
 * @author 铁木箱子
 *
 */
public class ContainerTag extends CompositeTag {
 private static final long serialVersionUID = -191586261848623602L;
 public static final String HTML_CONTAINER_TAG_NAME = "mzone-html-container";
  @Override
 public String[] getIds() {
  return new String[] { HTML_CONTAINER_TAG_NAME };
 }
}

 

      写完一个自定义html标签后,我们需要注册到htmlparser的解析其中,需要注意的是每个htmlparser解析器都需要单独注册额外的自定义html标签,我们这里先用自定义标签包裹要解析的html代码,然后再注册并解析根节点返回,代码片段如下:

package cc.mzone.html; 
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.PrototypicalNodeFactory;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList; 
/**
  * 获取包装后的顶层HTML元素
  * @param content
  * @return
  * @throws Exception
  */
public Node getRootNode(String content, String encoding) throws Exception {
 // 先用我们自定义的标签包裹需要解析的内容content
 StringBuilder buf = new StringBuilder();
 buf.append("<" + ContainerTag.HTML_CONTAINER_TAG_NAME + ">");
 buf.append(content);
 buf.append("</" + ContainerTag.HTML_CONTAINER_TAG_NAME + ">");
 // 获取一个htmlparser的解析器
 Parser parser = Parser.createParser(buf.toString(), encoding);
 // 注册一个已经注册了我们自定义标签的节点工厂给上面的解析器,这个是关键
 PrototypicalNodeFactory nodeFactory = new PrototypicalNodeFactory();
 nodeFactory.registerTag(new ContainerTag());
 parser.setNodeFactory(nodeFactory);
 // 解析内容获取顶层标签,即我们刚自定义的标签
 NodeList list = parser.parse(new TagNameFilter(ContainerTag.HTML_CONTAINER_TAG_NAME));
 return list.elementAt(0);
}

 

      然后我们就可以对这个内容进行分析和处理,等分析处理完成后,就需要获取最终的处理html内容,使用如下代码片段来获取:

package cc.mzone.html; 
/**
  * 获取最终的过滤结果
  * @param root
  * @return
  * @throws Exception
  */
public String getFinalResult(Node root) throws Exception {
 String result = root.toHtml();
 int len = ContainerTag.HTML_CONTAINER_TAG_NAME.length();
 return result.substring(len + 2, result.length() - len - 3);
}

 

      其中root节点就是我们在getRootNode中得到的根节点,也就是我们自定义的html标签,在这个方法中我们仅仅是去掉这个节点的名称而已,从而也就实现了我们想要的目标。使用这个自定义标签可以非常好的解决html格式不标准的问题,从而可以兼容更多的情况和场合。

 

分享到:
评论
1 楼 zhanjin 2012-08-06  
不标准的问题,从而可以兼容更多的情况和场合。

相关推荐

    扩展HTMLParser对自定义标签的处理能力

    资源名称:扩展HTMLParser对自定义标签的处理能力内容简介: HTMLParser是一个用来解析HTML文档的开放源码项目,它具有小巧、快速、使用简单的特点以及拥有强大的功能。 现在该项目的最新版本是Integration Build ...

    htmlparser(HTML页面解析)例子

    总结来说,HTMLParser是Python中用于解析HTML文档的基础工具,通过自定义事件处理方法,我们可以轻松地从中提取所需信息。尽管它可能不如某些更高级的库那样功能全面,但对于理解HTML结构和进行基础的数据提取,...

    Html解析助手htmlparser.jar

    3. **事件驱动解析**:`htmlparser.jar`支持事件驱动的解析模式,当遇到特定的HTML标签或事件时,会触发回调函数,这种方式对内存使用友好,适用于处理大型HTML文档。 4. **灵活性**:这个库允许用户自定义解析规则...

    HTML文档解析器 HTMLParser

    此外,开发者还可以利用HTMLParser库进行自定义解析任务,例如从HTML文档中提取特定信息、清洗HTML代码、或者在服务器端预处理HTML以减轻客户端的负担。在JavaScript中,有像`jsdom`这样的库可以模拟浏览器的HTML...

    html解析的利器,htmlParser

    `htmlParser`提供了事件驱动的解析模式,当解析器遇到如打开标签、关闭标签、文本内容等事件时,会触发相应的回调函数,这样我们就可以在这些回调中执行自定义逻辑。 例如,如果你想要提取所有的`&lt;a&gt;`标签链接,你...

    htmlparser解析html分页

    这个库可能被用于从网页中提取数据,比如在爬虫项目中,或者进行自动化测试时解析页面内容。本篇文章将深入探讨HTMLParser的工作原理、如何使用以及一些常见应用场景。 1. **HTMLParser库介绍** HTMLParser是...

    HtmlParser

    1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_starttag`、`handle_endtag`和`handle_data`,以便在遇到HTML标签开始、结束或数据时执行特定操作。 2. **启动爬虫*...

    c#版htmlparser htmlparser.dll htmlparser源代码

    通过阅读源代码,开发者可以学习到如何处理HTML标签、属性、文本节点以及如何处理嵌套的HTML结构。 在C#中,HTMLParser可能采用了递归下降解析器或基于事件的解析器模式。递归下降解析器通常使用函数或方法的递归来...

    解析htmlparser的所有jar包

    - **Web测试**:验证网页的结构是否符合预期,检查HTML标签的正确性。 为了使用这些jar包,你需要确保将它们添加到你的Java项目类路径中。然后,你可以按照HTMLParser的API文档编写代码,创建解析器实例,设置事件...

    基于Java的HTML文档解析器 HTMLParser.zip

    5. **灵活性**:HTMLParser允许用户自定义解析策略,可以根据项目需求过滤、修改或提取HTML内容。 6. **错误处理**:对于不可预测的HTML源码,HTMLParser有良好的错误处理机制,能容忍并尽可能恢复不完整的HTML结构...

    htmlparser解析Html的jar包和源文件包(两个)

    - **标签识别**:HTMLParser能够识别并处理HTML文档中的各种标签,如`&lt;div&gt;`、`&lt;p&gt;`、`&lt;a&gt;`等,同时支持自定义标签。 - **属性解析**:解析HTML元素的属性,例如`href`、`class`等,并提供访问这些属性的API。 - *...

    html解析两个jar htmllexer.jar htmlparser.jar

    需要注意的是,由于HTML的灵活性和非正规性,解析HTML时可能会遇到各种挑战,比如自定义标签、嵌套的脚本和样式,以及错误的语法。`htmllexer.jar` 和 `htmlparser.jar` 库应该已经考虑了这些问题,提供了一定程度的...

    基于java的HTML文档解析器 HTMLParser.zip

    这个压缩包`HTMLParser.zip`包含了一个实现这一功能的完整项目,可以帮助程序员高效地解析、操作和提取HTML页面中的信息。 在Java中,HTMLParser提供了一个强大的API,可以解析HTML文档并将其转换为一个可操作的...

    HTMLParser 2.0

    HTMLParser库的设计基于事件驱动的模式,它会为遇到的每一个HTML标签、属性、文本等内容触发特定的事件。通过继承自HTMLParser类并重写其方法,用户可以定制化解析过程,对HTML元素进行处理。例如,当遇到开始标签时...

    htmlparser_Java网页解析器

    4. **事件驱动模型**:`HtmlParser`通常采用事件驱动的方式工作,当遇到特定的HTML标签或内容时,会触发预定义的回调函数,允许开发者在解析过程中动态响应。 5. **灵活性**:库提供了多种配置选项,允许用户自定义...

    htmlparser的jar包

    在实际开发中,使用HTMLParser时,你可能需要处理一些常见的问题,比如CSS选择器的支持、JavaScript的解析、URL的处理等。虽然HTMLParser本身并不直接提供这些功能,但可以通过扩展其API或者与其他库(如Jsoup)结合...

    HTMLParser-2.0-API.CHM

    6. **错误处理**:HTMLParser提供了强大的错误处理机制,可以在解析过程中捕获并处理各种错误,确保程序的稳定性。 7. **灵活性**:HTMLParser不仅支持基本的HTML解析,还可以通过扩展支持XML和其他标记语言。 8. ...

    htmlParser2.0.jar

    1. **HTML标签解析**:HTMLParser2.0能识别并处理HTML文档中的各种标签,如`&lt;div&gt;`, `&lt;p&gt;`, `&lt;a&gt;`等,帮助开发者提取所需信息。 2. **自定义标签处理**:一个独特的特性是它支持处理自定义的HTML标签,这对于解析...

    htmlparser解析API

    你可以根据需求创建自定义的`TagProcessor`和`NodeFilter`来处理特定的HTML标签,或者过滤出需要的节点。HTMLParser的结构设计使得这些扩展非常直观和简单。 总的来说,HTMLParser是一个强大且易用的工具,适合那些...

    htmlparser1.4完整包下载

    3. **标签处理**:HTMLParser支持对HTML标签进行操作,如查找、替换、删除或修改标签的属性。 4. **内容提取**:能够方便地从HTML文档中提取文本内容,这对于数据抓取或信息提取任务非常有用。 5. **错误处理**:...

Global site tag (gtag.js) - Google Analytics