简述通过Java解析HTML文档.docx
《简述通过Java解析HTML文档.docx》由会员分享,可在线阅读,更多相关《简述通过Java解析HTML文档.docx(9页珍藏版)》请在冰点文库上搜索。
简述通过Java解析HTML文档
简述通过Java解析HTML文档
简述通过Java解析HTML文档
2011-04-0109:
14:
05
摘要JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文从实践的角度重点阐述Java语言中输入流类StreamTokenizer在编写HTML文件分析程序中的应用。
关键词:
javahtmlStreamTokenzerHtmlTokenizerApplet计算机
摘要JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文从实践的角度重点阐述Java语言中输入流类StreamTokenizer在编写HTML文件分析程序中的应用。
关键词:
javahtmlStreamTokenzerHtmlTokenizerApplet
计算机信息技术已经渗透到人们生活的方方面面,网络信息已成为我们日常信息主要来源之一。
而这些信息时如何在这神奇的网络上体现出的呢,这些网站是如何用机器语言编辑的等等。
弄明白这些的方法很多,在这将通过java简单解析html文件,并举实例进行说明。
1Java语言的概述
1.1Java语言的主要特点
Java语言是一种适用于网络编程的语言,它的基本结构与C++极为相似,但却简单得多。
它集成了其它一些语言的特点和优势,又避开了它们的不足之处。
Java的主要特点有:
简单性、平台独立性、面向对象的技术、多线程、动态性、安全性、高性能、分布性、强大性、解释性、可移植性等。
1.2Java解析Html工具
JavaHTMLParser提供了一组Tag对象,这些对象可以深入解析一棵可搜索的结构树。
HtmlRipper是一个Java包能够按照预先定义好的规则设置来从Web页中抽取动态数据.
Cobra是一个HTML工具包。
它包含一个纯JavaHTMLDOM分析器和一个页面表现引擎。
Cobra支持HTML4,Javascript和CSS2。
JavaMozillaHtmlParser能够将html解析成JavaDocument对象。
它是一个基于MozillaHtml解析器封装的Html解析类库。
因此能够为开发人员提供一个浏览器质量的HTML解析器。
1.3JavaApplet
通常翻译为Java小应用程序,也称Java小程序,它不是能独立运行的Java程序,而是通过支持Java浏览器来运行的Java程序。
在Java语言刚刚出现的时候,Java最吸引人的就是JavaApplet,用来创建WWW上的页面。
2HTML语言剖析
HTML全名为HyperTextMarkupLanguage,中文译为超文本标记语言,这是创建网页的脚本语言,它提供了精简而有力的文本定义,使我们可以设计出多姿多彩的超媒体文本(HypermediaDocument),通过HTTP(HyperTextTeansferProtocol)通信协议,是的HTML文本可以在全球互联网(WorldWideWeb,WWW)上进行跨平台的文件交换。
HTML文件为纯文本的文件格式,可以用任何文本编辑器或者用FrontPage、Dreamweaver等Web开发制作工具来编辑。
至于文件中的文字、字体、字体大小、段落、图片、表格及超级链接,甚至是文本名称都是以不同意的标记(Tags)来描述,以此来定义文件的结构与文件间的逻辑关联。
简而言之,HTML是以标记来描述文件中的多媒体信息。
3Web与HTML互联关系
Web服务器的核心是对HTML文件中的各标记(Tag)作出正确的分析,一种编程语言的解释程序也是对源文件中的保留字进行分析再做解释的。
实际应用中,我们也常常会遇到需要对某一特定类型文件进行关键字分析的情况,比如,需要将某个HTML文件下载并同时下载与之相关的.gif、.class等文件,此时就要求对HTML文件中的标记进行分离,找出所需的文件名及目录。
利用Java的输入流类StreamTokenizer进行HTML文件的分析,效果较好。
在此,我们要实现从已知的Web页面下载HTML文件,对其进行分析后,下载该页面中包含的HTML文件(如果在Frame中)、图像文件和Class(JavaApplet)文件。
4程序实现
4.1编写嵌入java小程序字节码文件的html文档
通过html的标记符可以把编译形成的字节码文件app2.class嵌入到html文档中。
其最基本的形式为:
其中,code属性指明了所要加载的字节码文件,它与网页在同一个文件夹下:
width和height属性分别给出了Applet显示区域的宽和高,单位为像素。
使用Windows的记事本,键入下面的html源文件:
并将网页文件保存在字节按在的目录下,文件名可任意命名,例如page.htm。
这样就把小程序字节码文件App2.class嵌入到网页page1.htm中。
4.2利用Java实现HTML的编辑
首先要有一个编辑框,这个编辑框其实就是一个可编辑状态的网页,我们用iframe来建立编辑框。
并且在加上javascript代码来指定HtmlEdit有编辑功能:
vareditor;
editor=document.getElementById("HtmlEdit").contentWindow;
//只需键入以下设定,iframe立刻变成编辑器。
editor.document.designMode='On';
editor.document.contentEditable=true;
//但是IE与FireFox有点不同,为了兼容FireFox,所以必须创建一个新的document。
editor.document.open();
editor.document.writeln('');
editor.document.close();//字体特效-加粗方法一
functionaddBold()
{
editor.focus();//所有字体特效只是使用execComman()就能完成。
editor.document.execCommand("Bold",false,null);
}
//字体特效-加粗方法二
functionaddBold()
{
editor.focus();//获得选取的焦点
varsel=editor.document.selection.createRange();
insertHTML(""+sel.text+"");
}
functioninsertHTML(html)
{
if(editor.document.selection.type.toLowerCase()!
="none")
{
editor.document.selection.clear();
}
editor.document.selection.createRange().pasteHTML(html);
}
4.3对某个令牌流进行分析之前,首先应对该令牌流的语法表进行设置,在本例中,即是让程序分出哪个单词是HTML的标记。
importjava.io.*;
importhttp:
//java.lang.String;
classHtmlTokenizerextends好论文123
StreamTokenizer{
//定义各标记,这里的标记仅是本例中必须的,
可根据需要自行扩充
staticintHTML_TEXT=-1;
staticintHTML_UNKNOWN=-2;
staticintHTML_EOF=-3;
staticintHTML_IMAGE=-4;
staticintHTML_FRAME=-5;
staticintHTML_BACKGROUND=-6;
staticintHTML_APPLET=-7;
booleanoutsideTag=true;//判断是否在标记之中
//构造器,定义该令牌流的语法表。
publicHtmlTokenizer(BufferedReaderr){
super(r);
this.resetSyntax();//重置语法表
this.wordChars(0,255);//令牌范围为全部字符
this.ordinaryChar('标记两边的分割符
this.ordinaryChar('>');
}//endofconstructor
publicintnextHtml(){
inttoken;//令牌
try{
switch(token=this.nextToken()){
caseStreamTokenizer.TT_EOF:
//如果已读到流的尽头,则返回TT_EOF
returnHTML_EOF;
case'进入标记字段
outsideTag=false;
returnnextHtml();
case'>':
//出标记字段
outsideTag=true;
returnnextHtml();
caseStreamTokenizer.TT_WORD:
//若当前令牌为单词,判断是哪个标记
if(allWhite(sval))
returnnextHtml();//过滤其中空格
elseif(sval.toUpperCase().indexOf("FRAME")
!
=-1&&!
outsideTag)//标记FRAME
returnHTML_FRAME;
elseif(sval.toUpperCase().indexOf("IMG")
!
=-1&&!
outsideTag)//标记IMG
returnHTML_IMAGE;
elseif(sval.toUpperCase().indexOf("BACKGROUND")
!
=-1&&!
outsideTag)//标记BACKGROUND
returnHTML_BACKGROUND;
elseif(sval.toUpperCase().indexOf("APPLET")
!
=-1&&!
outsideTag)//标记APPLET
returnHTML_APPLET;
default:
System.out.println("Unknowntag:
"+token);
returnHTML_UNKNOWN;
}//endofcase
}catch(IOExceptione){
System.out.println("Error:
"+e.getMessage());}
returnHTML_UNKNOWN;
}//endofnextHtml
protectedbooleanallWhite(Strings){//过滤所有空格
//实现略
}//endofallWhite
}//endofclass
5程序调试心得
5.1Java是严格区分大小写的,但html标记语言并不区分别大小写,因此除嵌入的字节码文件名大小写必须与编译后的文件名一致外,其他标记符大小写都可以。
5.2对某个令牌流进行分析之前,首先应对该令牌流的语法表进行设置
5.3懂得了在一程序中如何引用自定义的类中的方法和变量,在程序开头加入import类名;在程序中加入类名实例=new类名();然后使用实例.方法(),实例.变量即可。
5.4htmlparser用于对html页面进行解析很实用,它是一个功能比较强大的工具。
本文对Java解析HTML文档的过程作了简单阐述,并通编写嵌入java小程序字节码文件的html文档、利用Java实现HTML的编辑及StreamTokenzer建立了深入的分析。
Java实现对Html文档的分析具有快速性、简单性等特点,当然在其实现过程中必将存在着一些不足之处,以后将会慢慢改进。
但是,随着计算机语言的发展,对网络更加的人性化的迫切要求,java技术随速发展必将成最受欢迎的计算机网络编辑语言之一。
HTML解析器
2011-04-0310:
05:
53
今天已经是有做HTML解析器的想法好几天了,一开始是一个朋友要我帮忙处理下从网页上的表格中获取信息,然后分项保存到数据库中,实现数据本地化。
一开始就打算好好做一个,以后也可以通用,经过一个多星期的资料收集和试验,现在分析器的雏形已经出来了。
在一开始的时候打算直接用.NET中字符处理的方法来做,但过于复杂和麻烦,而且效率不高;然后有想到把HTML当做XML用XML相关的类来解析,但HTML的语法比较松散;还试过SgmlReader,这个东西的解析也不够满意。
最后觉得用正则表达式来做(我学习了5天,已经深入到自动机的理论),选用的原因:
一、效率高;
二、容错性好。
应为HTML没有XML那样严格的语法规范,HTML要松散些。
但正则表达式有个缺点,如果要匹配最近的正则表达式要相当复杂,而且我也没有研究出来。
我的解决办法是象Table用Match匹配出文字,然后用Match的index获得匹配的位置,再用SubString方法取得值字符串。
效果还不错哦。
现在遇到的问题:
如果Table中包含Table那么对TR的分解将出来错误。
这个解析器只是作为个人爱好去研究,陆陆续续的投入精力,持续了很长时间,这期间发生了很多的事情。
我在上海落脚很长时间后才又继续开发,并把项目命名为Wittiness。
项目的目的:
构建一个Web信息挖掘机,能够高效方便的从网页中截取到需要的信息。
构建思路是:
解析HTML标记-->构建层次对象-->查询获取承载了需要信息的对象-->按对象层次输出结果
其中难度比较大的就是解析标记和查询获取对象。
解析标记我用过了正则表达式,字符串判断,SgmlReader,最好觉得SgmlReader用起来简单,效率也高。
查询获取对象,目前实现的主要方法是以表为单位,按索引数来获得,这一块花的时间也比较少。
新的想法:
把HTML拆开读取为string[]单位为一个HTML标记,用两个数组指针来确定要截取的部分,以个从头开始检索,一个从尾开始检索,这样能很好的解决标记配对的问题。
在构造对象层次结构时候也只用数组指针,我想这样应该能提供效率和节约内存。
再往后,可以把这个方法改进为流式处理,那么在读取大文件的时候效率就更高了。
如果能有一个GUI的界面来让用户选择需要截取的内容,那么操作就更加方便了,不知道,象DreamWeaver这样的编辑器是怎么样开发的。