技术标签: T_网络 ViewUI java T_java javascript
原文出处: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格式不标准的问题,从而可以兼容更多的情况和场合。
datagridview的若干问题与解决方法datagridview做完已几天了,是时候写个总结了。我的任务是datagridview读取Excel数据,并能够像操作Excel一样进行复制、剪切、粘贴、清空、增加行、删除行、增加列、删除列,导出Excel/Word.现将我遇到额问题与解决方法一一陈述。1.导入Excel。代码走先。 public void
在如今这个知识爆炸的时代,很多人都会有一个疑惑,知识付费项目是割韭菜吗?花几百几千块钱进行付费学习真的值吗?如果知识付费项目是割韭菜的话,那为什么还有那么多人挤破头也要去上名校,花巨资出国留学呢?今天是一个不断需要学习和进化的一个过程, 只不过现在手机上的知识付费的形式更加的方便,更加的便捷,因为它碎片化,更容易去接受和学习。很多人讲知识付费就是一波一波地在割韭菜,这是为什么呢?因为他根本不知道知识的价值,虽然说知识不能直接转化为财富,但是在获取和学习这个知识的过程中, 你至少学会了两点能力。第
问题$ protoc --go_out=./ hello.protoprotoc-gen-go: unable to determine Go import path for "hello.proto"Please specify either: • a "go_package" option in the .proto source file, or • a "M" argument on the command line.See https://deve.
在进行测试的过程中,我们的样品数量有很多,但是不同的样品测试完就形成了一个独立的文件,不同样品会形成不同的文件,因此,有时在进行数据处理之前,需要将这些数据列表进行合并统一分析,本文上传我的方法:本文的内容一共分为文件打开,数据合并,数据保存三部分1 文件打开:**#打开文件def open(file_csv): df=pd.read_csv(filepath_or_buffer='c:\\Users\\dell\\Desktop\\test.csv',
How to check for NAN / INF / IND in C++Recently we had occasional, but serious problems with some software we’re making. The problems were with invalid floating point numbers.Once inva
P1446 [HNOI2008]Cards题意:有n张牌,染三种颜色,每种颜色规定数目,给出m种不同的洗牌方法。两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种。求对P取模的结果题解:参考文章置换群,Polya引理和burnside引理(等价类计数问题)题目中说:输入数据保证任意多次洗牌都可用这m种洗牌法种的一种代替。这句话是burnside引理使用的理由,这句话保证了置换群的大小只会是(m+1)种(这个1指的是自己映射自己),否则
概述:Java Excel 电子表格 API 库是一种编程接口,允许开发人员以编程方式大规模地创建和操作 Excel 文档。GrapeCity Documents for Excel 是一种解决方案,允许开发人员导入/导出、创建报告和模板,以及跨 Java 应用程序部署电子表格。
1、MapReduce原理2.MapReduce执行时间3.MapReduce开发4.Yarn
PLSQL:MERGE的用法MERGE INTO fzq1 aa --fzq1表是需要更新的表USING fzq bb -- 关联表ON (aa.id = bb.id) --关联条件WHEN MATCHED THEN --匹配关联条件,作更新处理 UPDATE SET aa.chengji = bb.chengji + 1, aa.name
看到可用gdb调试程序来发现segmentation fault,于是一时心痒,想去看gdb的调试信息。毕竟linux下的调试我还是空白。本人是在VM上装ubuntu 9.10,编写了一个神一样的程序hello.cpp,然后gcc了一下,发现有个错误gcc:error trying to exec 'cclplus':execvp:没有该文件或目录,后来发现原来是没有安装g++,然后sudo
基本概念:1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。2> pty(虚拟终端):但是如果我们远程telnet
时钟管理模块是linux系统为统一管理各硬件的时钟而实现管理框架,负责所有模块的时钟调节和电源管理。时钟管理模块主要负责处理各硬件模块的工作频率调节及电源切换管理。一个硬件模块要正常工作,必须先配置好硬件的工作频率、打开电源开关、总线访问开关等操作,时钟管理模块为设备驱动提供统一的操作接口,使驱动不用关心时钟硬件实现的具体细节。 1.系统时钟结构 系统时钟主要是指一些