首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > CSS >

运用HtmlParser提取HTML文本块

2012-08-31 
使用HtmlParser提取HTML文本块????|style[\\s\\S]*?/style+????|![\\s\\S]*???Pattern pattern

使用HtmlParser提取HTML文本块

????"|<style[\\s\\S]*?</style>"+
????"|<![\\s\\S]*?>";
??Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
??Matcher match=pattern.matcher(html);
??html=match.replaceAll("");
??return html;
?}

输入的是原始的html字符串,输出的结果就将以上垃圾信息过滤掉了 :)

<2>使用HtmlParser过滤script和style标签信息以及文本信息:

?public String htmlInit(String htmlStr){
??NodeFilter scriptFilter=new NodeClassFilter(ScriptTag.class);
??NodeFilter styleFilter=new NodeClassFilter(StyleTag.class);
??NodeFilter[] filter={scriptFilter,styleFilter};
??OrFilter orFilter=new OrFilter(filter);
??try {
???htmlStr=ParserUtils.trimTags(htmlStr,orFilter,true,true);
??} catch (ParserException e) {
???e.printStackTrace();
??} catch (UnsupportedEncodingException e) {
???e.printStackTrace();
??}
??return htmlStr;
?}

这里使用的OrFilter让人倾倒,本质上无非就是一个数组型的过滤器,实现循环过滤罢了。

?小结:比较起来,从代码量上来看,显然使用正则表达式更为简略,而且实现效果比起后者,过滤的更为彻底。我一直在寻找捷径,其实捷径不一定就是别人走出来的。当然,使用正则表达式的一个缺憾就是损坏了原来html的完整的结构,从而破坏了定位标签位置的实现。还要注意的一点就是,使用Parser.parser(Filter filter)还要初始化parser的编码,以胜任对中文的处理,要知道,它默认的字符编码是ISO-8859-1,在处理中文的时候,如果没有parser.setEncoding("GB2312")这一步,可能看到的是乱码了,或者直接抛出编码转换的错误。

我们多次强调要保存标签位置信息,其实是有目的的,即在完成建立索引,向用户提供查询时,实现关键字飘红或者动态摘要生成的目的。现在,如果采取第一种过滤方式,就使我们丢弃了这种信息,但是还有补救方法,即我们在提供关键字飘红和动态摘要的生成,完全可以基于所有关键字集合来讲,而不是基于全文的。

下面,为了回馈社会,我将前面长篇大论的提取正文信息的代码贴上:

//?提取网页主要文本内容
?public String getContent(){
??content=(isHub())?getHubEntries():getTopicBlock();
??System.out.println("<Content>:");
??System.out.println("=========================");
??System.out.println(content);
??return content;
?}
//?提取Hub类网页文本内容,如yahoo,sina等门户网
?public String getHubEntries(){
??StringBean bean=new StringBean();
??bean.setLinks(false);
??bean.setReplaceNonBreakingSpaces(true);
??bean.setCollapse(true);
??try {
???parser.visitAllNodesWith(bean);
??} catch (ParserException e) {
???System.err.println("getHubEntries()-->"+e);
??}
??parser.reset();
??return bean.getStrings();
?}
?
//?获取主题性(Topical)网页文本内容:对于博客等以文字为主体的网页效果较好
?public String getTopicBlock(){
??
??HasParentFilter acceptedFilter=new HasParentFilter(new TagNameFilter("p"));
??NodeList nodes=null;
??try {
???nodes=parser.extractAllNodesThatMatch(acceptedFilter);
??} catch (ParserException e) {
???System.err.println("getTopicBlock"+e);
??}
??
??StringBuffer sb=new StringBuffer();
??SimpleNodeIterator iter=nodes.elements();
??while(iter.hasMoreNodes()){
???Node node=iter.nextNode();
???sb.append(node.getText()+"\n");
??}
??parser.reset();
??return sb.toString();
?}

说实话,具体效果还真不太好,细节问题还有一箩筐,比如要剔除广告信息怎么处理,如何利用版权声明中的"About us"或者"关于我们"的链接网页,提取信息补充关键词和摘要信息,同时将声明的其余部分毫不保留的过滤掉....

补充说一下,有人提出通过遍历html所有标签,统计其中的文本文字的比特数与标签的比率,根据到达正文尾部可以达到最大化的统计假设来实现,我觉着这种方法也许是正解,慢慢研究咯。

结语:到目前为止,我对HtmlParser的研究还是皮毛,谬误之处多多,还望大虾们多多指教。它让我产生一种冲动,即按照树的结构写出自己的API,努力一把,兴许还真有收获吧!目前正在尝试着搭建一个搜索引擎,学海无涯啊!

热点排行