Alpha
多少春秋风雨改 多少崎岖不变爱
BlogJava
首页
新随笔
联系
聚合
管理
随笔-179 评论-666 文章-29 trackbacks-0
[转]利用Java编写HTML文件分析程序
本文从实践的角度重点阐述Java语言中输入流类StreamTokenizer在编写HTML文件分析程序中的应用,并介绍了以字节为单位下载Web页面的例程。
一、概述
Web服务器的核心是对HTML文件中的各标记(Tag)作出正确的分析,一种编程语言的解释程序也是对源文件中的保留字进行分析再做解释的。实际应用中,我们也常常会遇到需要对某一特定类型文件进行关键字分析的情况,比如,需要将某个HTML文件下载并同时下载与之相关的.gif、.class等文件,此时就要求对HTML文件中的标记进行分离,找出所需的文件名及目录。在Java出现以前,类似工作需要对文件中的每个字符进行分析,从中找出所需部分,不仅编程量大,且易出错。笔者在近期的项目中利用Java的输入流类StreamTokenizer进行HTML文件的分析,效果较好。在此,我们要实现从已知的Web页面下载HTML文件,对其进行分析后,下载该页面中包含的HTML文件(如果在Frame中)、图像文件和Class(Java Applet)文件。
二、StreamTokenizer类
StreamTokenizer即令牌化输入流的作用是将一个输入流中变成令牌流。令牌流中的令牌实体有三类:单词(即多字符令牌)、单字符令牌和空白(包括Java和C/C++中的说明语句)。
StreamTokenizer类的构造器为: StreamTokenizer(InputStream in)
该类有一些公有实例变量:ttype、sval和nval ,分别表示令牌类型、当前字符串值和当前数字值。当我们需要取得令牌(即HTML中的标记)之间的字符时,应访问变量sval。而读向下一个令牌的方法是调用nextToken()。方法nextToken()的返回值是int型,共有四种可能的返回:
StreamTokenizer.TT_NUMBER: 表示读到的令牌是数字,数字的值是double型,可以从实例变量nval中读取。
StreamTokenizer.TT_WORD: 表示读到的令牌是非数字的单词(其他字符也在其中),单词可以从实例变量sval中读取。
StreamTokenizer.TT_EOL: 表示读到的令牌是行结束符。
如果已读到流的尽头,则nextToken()返回TT_EOF。
开始调用nextToken()之前,要设置输入流的语法表,以便使分析器辨识不同的字符。WhitespaceChars(int low, int hi)方法定义没有意义的字符的范围。WordChars(int low, int hi)方法定义构造单词的字符范围。
三、程序实现
1、HtmlTokenizer类的实现
对某个令牌流进行分析之前,首先应对该令牌流的语法表进行设置,在本例中,即是让程序分出哪个单词是HTML的标记。下面给出针对我们需要的HTML标记的令牌流类定义,它是StreamTokenizer的子类:
1
import
java.io.
*
;
2
import
java.lang.String;
3
class
HtmlTokenizer
extends
4
StreamTokenizer
{
5
//
定义各标记,这里的标记仅是本例中必须的,
6
可根据需要自行扩充
7
static
int
HTML_TEXT
=-
1
;
8
static
int
HTML_UNKNOWN
=-
2
;
9
static
int
HTML_EOF
=-
3
;
10
static
int
HTML_IMAGE
=-
4
;
11
static
int
HTML_FRAME
=-
5
;
12
static
int
HTML_BACKGROUND
=-
6
;
13
static
int
HTML_APPLET
=-
7
;
14
15
boolean
outsideTag
=
true
;
//
判断是否在标记之中
16
17
//
构造器,定义该令牌流的语法表。
18
public
HtmlTokenizer(BufferedReader r)
{
19
super
(r);
20
this
.resetSyntax();
//
重置语法表
21
this
.wordChars(
0
,
255
);
//
令牌范围为全部字符
22
this
.ordinaryChar(
'
<
'
);
//
HTML标记两边的分割符
23
this
.ordinaryChar(
'
>
'
);
24
}
//
end of constructor
25
26
public
int
nextHtml()
{
27
int
token;
//
令牌
28
try
{
29
switch
(token
=
this
.nextToken())
{
30
case
StreamTokenizer.TT_EOF:
31
//
如果已读到流的尽头,则返回TT_EOF
32
return
HTML_EOF;
33
case
'
<
'
:
//
进入标记字段
34
outsideTag
=
false
;
35
return
nextHtml();
36
case
'
>
'
:
//
出标记字段
37
outsideTag
=
true
;
38
return
nextHtml();
39
case
StreamTokenizer.TT_WORD:
40
//
若当前令牌为单词,判断是哪个标记
41
if
(allWhite(sval))
42
return
nextHtml();
//
过滤其中空格
43
else
if
(sval.toUpperCase().indexOf(
"
FRAME
"
)
44
!=-
1
&&
!
outsideTag)
//
标记FRAME
45
return
HTML_FRAME;
46
else
if
(sval.toUpperCase().indexOf(
"
IMG
"
)
47
!=-
1
&&
!
outsideTag)
//
标记IMG
48
return
HTML_IMAGE;
49
else
if
(sval.toUpperCase().indexOf(
"
BACKGROUND
"
)
50
!=-
1
&&
!
outsideTag)
//
标记BACKGROUND
51
return
HTML_BACKGROUND;
52
else
if
(sval.toUpperCase().indexOf(
"
APPLET
"
)
53
!=-
1
&&
!
outsideTag)
//
标记APPLET
54
return
HTML_APPLET;
55
default
:
56
System.out.println (
"
Unknown tag:
"
+
token);
57
return
HTML_UNKNOWN;
58
}
//
end of case
59
}
catch
(IOException e)
{
60
System.out.println(
"
Error:
"
+
e.getMessage());}
61
return
HTML_UNKNOWN;
62
}
//
end of nextHtml
63
64
protected
boolean
allWhite(String s)
{
//
过滤所有空格
65
//
实现略
66
}
//
end of allWhite
67
68
}
//
end of class
69
posted on 2007-01-18 16:58
Alpha
阅读(1617)
评论(3)
编辑
收藏
所属分类:
Java J2EE JSP
评论:
#
re: [转]利用Java编写HTML文件分析程序 2007-09-04 16:04 |
yslin_1985
非常感谢你的转载,我正要用java分类下载网页的文件,你转载的这篇技术文章对我启发很大,只是,好像你没有转载完,是么?希望下次你转载的时候能注明转载的网址,给我们更多的方便。再次表示感谢。
回复
更多评论
#
re: [转]利用Java编写HTML文件分析程序 2007-09-04 16:06 |
yslin_1985
另外,哥们儿是Beyond的fans吧?me too.
回复
更多评论
#
re: [转]利用Java编写HTML文件分析程序
2007-09-22 23:26 |
Alpha
@yslin_1985
呵呵,黄家驹忠实FANS,一生不变~!
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Ubuntu 14.04 安装 php nginx mysql JDK 8 svn
jsp页面中,JSTL El表达式字符串比较常用方法
lighttpd配置之代理、负载均衡(mod_proxy)
linux+nginx+tomcat负载均衡,实现session同步
CLASSPATH
如何选择开源许可证?
utf-8项目生成javadoc 编码GBK 的不可映射字符
BeanUtils & PropertyUtils & MethodUtils类使用方法
Apache tomcat 日志分析
如何删除JSP编译后的空行
今日记一事,明日悟一理,积久而成学。
<
2007年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(32)
给我留言
查看公开留言
查看私人留言
随笔分类
(182)
Android 移动开发
Hibernate(2)
Java J2EE JSP(31)
jQuery JavaScript Flex(5)
Linux Nginx(28)
MySQL NoSQL(14)
PHP ThinkPHP(2)
SEO优化 网站推广(1)
Spring(3)
吴语轮笔(81)
吾亦好摄(8)
开源开发工具使用(2)
网站设计 用户体验(5)
文章分类
(39)
J2EE+JSP(1)
JavaScript(9)
Linux、操作系统(9)
人生哲理(4)
多愁善感(11)
愤青集中营(2)
数据库SQL(3)
相册
06圣诞节
07.1.7水濂山
07年元旦
原创图片
杂七杂八
校庆
梅花
友情链接
VIP卡云
坏男孩
田逸blog
黎波
我的地盘
技术文档
CSS 样式表参考文档
DHTML 参考手册
DWR中文文档
MySQL 5.1参考手册
Spring Framework 开发参考手册
灰狐文档中心
搜索
积分与排名
积分 - 1327361
排名 - 20
最新随笔
1. Centos7安装Nginx+PHP+MySQL
2. Ubuntu完美安装搭建Git服务器
3. Git本地服务器搭建及使用详解
4. Linux 常见运维命令
5. Linux怎样恢复误删除的数据
6. CentOS 7 安裝 Nginx、PHP7、PHP-FPM
7. Tomcat8 安全配置与性能优化
8. Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
9. Ubuntu14.04下搭建VPN服务
10. CentOS 6.4 配置VPN服务教程
最新评论
1. re: Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
相当成功
--reatang
2. re: mysql alter 语句用法,添加、修改、删除字段等
密密麻麻吗
--,,,
3. eettafellamp
评论内容较长,点击标题查看
--eettafellamp
4. re: 使用Spring MVC表单标签
水电费
-- 低调
5. aanrechtblad
评论内容较长,点击标题查看
--aanrechtblad
6. re: Tomcat8 安全配置与性能优化[未登录]
评论内容较长,点击标题查看
--aa
7. re: Tomcat8 安全配置与性能优化[未登录]
评论内容较长,点击标题查看
--aa
8. aa[未登录]
啊啊啊啊
--aa
9. re: Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
可以可以可以
--司马青衫
10. re: mysql alter 语句用法,添加、修改、删除字段等[未登录]
1111
--a
阅读排行榜
1. MySQL的mysqldump工具的基本用法(237529)
2. mysql alter 语句用法,添加、修改、删除字段等(166835)
3. HttpClient 学习整理(143489)
4. c3p0详细配置(91780)
5. Mysql日期和时间函数大全(61367)
6. Hibernate 不同数据库的连接及SQL方言(50258)
7. iptables 开启80端口 (32130)
8. AS与JS相互通信(Flex中调用js函数)(26651)
9. 使用Spring MVC表单标签(23948)
10. JFreeChart在JSP中的应用实例(22525)
11. scrollbar属性、样式详解(20543)
12. linux+nginx+tomcat负载均衡,实现session同步(20414)
13. 多级反向代理[Squid]下获取客户端真实IP地址(16370)
14. linux rsync同步设置详细指南(15665)
15. jsp页面中,JSTL El表达式字符串比较常用方法(15557)
评论排行榜
1. 南雄中学百年校庆(91)
2. HttpClient 学习整理(44)
3. JFreeChart在JSP中的应用实例(29)
4. c3p0详细配置(26)
5. 从MySQL得到最大的性能(20)
6. 学会如何去爱一个人(16)
7. 千年珠玑(15)
8. 笑翻天乐园-痛并快乐着(14)
9. 说说我们技术部(13)
10. MySQL的mysqldump工具的基本用法(12)
11. 述 职 报 告(11)
12. 多级反向代理[Squid]下获取客户端真实IP地址(11)
13. 双喜临门(10)
14. 元旦遭遇人山人海(9)
15. 一个身材超好的MM(7)