Alpha
多少春秋風(fēng)雨改 多少崎嶇不變愛(ài)
BlogJava
首頁(yè)
新隨筆
聯(lián)系
聚合
管理
隨筆-179 評(píng)論-666 文章-29 trackbacks-0
[轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序
本文從實(shí)踐的角度重點(diǎn)闡述Java語(yǔ)言中輸入流類(lèi)StreamTokenizer在編寫(xiě)HTML文件分析程序中的應(yīng)用,并介紹了以字節(jié)為單位下載Web頁(yè)面的例程。
一、概述
Web服務(wù)器的核心是對(duì)HTML文件中的各標(biāo)記(Tag)作出正確的分析,一種編程語(yǔ)言的解釋程序也是對(duì)源文件中的保留字進(jìn)行分析再做解釋的。實(shí)際應(yīng)用中,我們也常常會(huì)遇到需要對(duì)某一特定類(lèi)型文件進(jìn)行關(guān)鍵字分析的情況,比如,需要將某個(gè)HTML文件下載并同時(shí)下載與之相關(guān)的.gif、.class等文件,此時(shí)就要求對(duì)HTML文件中的標(biāo)記進(jìn)行分離,找出所需的文件名及目錄。在Java出現(xiàn)以前,類(lèi)似工作需要對(duì)文件中的每個(gè)字符進(jìn)行分析,從中找出所需部分,不僅編程量大,且易出錯(cuò)。筆者在近期的項(xiàng)目中利用Java的輸入流類(lèi)StreamTokenizer進(jìn)行HTML文件的分析,效果較好。在此,我們要實(shí)現(xiàn)從已知的Web頁(yè)面下載HTML文件,對(duì)其進(jìn)行分析后,下載該頁(yè)面中包含的HTML文件(如果在Frame中)、圖像文件和Class(Java Applet)文件。
二、StreamTokenizer類(lèi)
StreamTokenizer即令牌化輸入流的作用是將一個(gè)輸入流中變成令牌流。令牌流中的令牌實(shí)體有三類(lèi):?jiǎn)卧~(即多字符令牌)、單字符令牌和空白(包括Java和C/C++中的說(shuō)明語(yǔ)句)。
StreamTokenizer類(lèi)的構(gòu)造器為: StreamTokenizer(InputStream in)
該類(lèi)有一些公有實(shí)例變量:ttype、sval和nval ,分別表示令牌類(lèi)型、當(dāng)前字符串值和當(dāng)前數(shù)字值。當(dāng)我們需要取得令牌(即HTML中的標(biāo)記)之間的字符時(shí),應(yīng)訪問(wèn)變量sval。而讀向下一個(gè)令牌的方法是調(diào)用nextToken()。方法nextToken()的返回值是int型,共有四種可能的返回:
StreamTokenizer.TT_NUMBER: 表示讀到的令牌是數(shù)字,數(shù)字的值是double型,可以從實(shí)例變量nval中讀取。
StreamTokenizer.TT_WORD: 表示讀到的令牌是非數(shù)字的單詞(其他字符也在其中),單詞可以從實(shí)例變量sval中讀取。
StreamTokenizer.TT_EOL: 表示讀到的令牌是行結(jié)束符。
如果已讀到流的盡頭,則nextToken()返回TT_EOF。
開(kāi)始調(diào)用nextToken()之前,要設(shè)置輸入流的語(yǔ)法表,以便使分析器辨識(shí)不同的字符。WhitespaceChars(int low, int hi)方法定義沒(méi)有意義的字符的范圍。WordChars(int low, int hi)方法定義構(gòu)造單詞的字符范圍。
三、程序?qū)崿F(xiàn)
1、HtmlTokenizer類(lèi)的實(shí)現(xiàn)
對(duì)某個(gè)令牌流進(jìn)行分析之前,首先應(yīng)對(duì)該令牌流的語(yǔ)法表進(jìn)行設(shè)置,在本例中,即是讓程序分出哪個(gè)單詞是HTML的標(biāo)記。下面給出針對(duì)我們需要的HTML標(biāo)記的令牌流類(lèi)定義,它是StreamTokenizer的子類(lèi):
?1
????????
import
?java.io.
*
;?
?2
import
?java.lang.String;?
?3
class
?HtmlTokenizer?
extends
?
?4
StreamTokenizer?
{?
?5
//
定義各標(biāo)記,這里的標(biāo)記僅是本例中必須的,?
?6
可根據(jù)需要自行擴(kuò)充?
?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
;?
//
判斷是否在標(biāo)記之中?
16
?
17
?
//
構(gòu)造器,定義該令牌流的語(yǔ)法表。?
18
?
public
?HtmlTokenizer(BufferedReader?r)?
{?
19
super
(r);?
20
this
.resetSyntax();?
//
重置語(yǔ)法表?
21
this
.wordChars(
0
,
255
);?
//
令牌范圍為全部字符?
22
this
.ordinaryChar(
'
<?
'
);?
//
HTML標(biāo)記兩邊的分割符?
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
?
'
<?
'
:?
//
進(jìn)入標(biāo)記字段?
34
outsideTag
=
false
;?
35
return
?nextHtml();?
36
case
?
'
>
'
:?
//
出標(biāo)記字段?
37
outsideTag
=
true
;?
38
return
?nextHtml();?
39
case
?StreamTokenizer.TT_WORD:?
40
//
若當(dāng)前令牌為單詞,判斷是哪個(gè)標(biāo)記?
41
if
?(allWhite(sval))?
42
?
return
?nextHtml();?
//
過(guò)濾其中空格?
43
else
?
if
(sval.toUpperCase().indexOf(
"
FRAME
"
)?
44
!=-
1
?
&&
?
!
outsideTag)?
//
標(biāo)記FRAME?
45
?
return
?HTML_FRAME;?
46
else
?
if
(sval.toUpperCase().indexOf(
"
IMG
"
)?
47
!=-
1
?
&&
?
!
outsideTag)?
//
標(biāo)記IMG?
48
?
return
?HTML_IMAGE;?
49
else
?
if
(sval.toUpperCase().indexOf(
"
BACKGROUND
"
)?
50
!=-
1
?
&&
?
!
outsideTag)?
//
標(biāo)記BACKGROUND?
51
?
return
?HTML_BACKGROUND;?
52
else
?
if
(sval.toUpperCase().indexOf(
"
APPLET
"
)?
53
!=-
1
?
&&
?
!
outsideTag)?
//
標(biāo)記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)
{
//
過(guò)濾所有空格?
65
//
實(shí)現(xiàn)略?
66
?}
//
?end?of?allWhite?
67
?
68
}
?
//
end?of?class?
69
posted on 2007-01-18 16:58
Alpha
閱讀(1627)
評(píng)論(3)
編輯
收藏
所屬分類(lèi):
Java J2EE JSP
評(píng)論:
#
re: [轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序 2007-09-04 16:04 |
yslin_1985
非常感謝你的轉(zhuǎn)載,我正要用java分類(lèi)下載網(wǎng)頁(yè)的文件,你轉(zhuǎn)載的這篇技術(shù)文章對(duì)我啟發(fā)很大,只是,好像你沒(méi)有轉(zhuǎn)載完,是么?希望下次你轉(zhuǎn)載的時(shí)候能注明轉(zhuǎn)載的網(wǎng)址,給我們更多的方便。再次表示感謝。
回復(fù)
更多評(píng)論
#
re: [轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序 2007-09-04 16:06 |
yslin_1985
另外,哥們兒是Beyond的fans吧?me too.
回復(fù)
更多評(píng)論
#
re: [轉(zhuǎn)]利用Java編寫(xiě)HTML文件分析程序
2007-09-22 23:26 |
Alpha
@yslin_1985
呵呵,黃家駒忠實(shí)FANS,一生不變~!
回復(fù)
更多評(píng)論
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
Ubuntu 14.04 安裝 php nginx mysql JDK 8 svn
jsp頁(yè)面中,JSTL El表達(dá)式字符串比較常用方法
lighttpd配置之代理、負(fù)載均衡(mod_proxy)
linux+nginx+tomcat負(fù)載均衡,實(shí)現(xiàn)session同步
CLASSPATH
如何選擇開(kāi)源許可證?
utf-8項(xiàng)目生成javadoc 編碼GBK 的不可映射字符
BeanUtils & PropertyUtils & MethodUtils類(lèi)使用方法
Apache tomcat 日志分析
如何刪除JSP編譯后的空行
今日記一事,明日悟一理,積久而成學(xué)。
<
2007年1月
>
日
一
二
三
四
五
六
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
31
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(32)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lèi)
(182)
Android 移動(dòng)開(kāi)發(fā)
Hibernate(2)
Java J2EE JSP(31)
jQuery JavaScript Flex(5)
Linux Nginx(28)
MySQL NoSQL(14)
PHP ThinkPHP(2)
SEO優(yōu)化 網(wǎng)站推廣(1)
Spring(3)
吳語(yǔ)輪筆(81)
吾亦好攝(8)
開(kāi)源開(kāi)發(fā)工具使用(2)
網(wǎng)站設(shè)計(jì) 用戶體驗(yàn)(5)
文章分類(lèi)
(39)
J2EE+JSP(1)
JavaScript(9)
Linux、操作系統(tǒng)(9)
人生哲理(4)
多愁善感(11)
憤青集中營(yíng)(2)
數(shù)據(jù)庫(kù)SQL(3)
相冊(cè)
06圣誕節(jié)
07.1.7水濂山
07年元旦
原創(chuàng)圖片
雜七雜八
校慶
梅花
友情鏈接
VIP卡云
壞男孩
田逸blog
黎波
我的地盤(pán)
技術(shù)文檔
CSS 樣式表參考文檔
DHTML 參考手冊(cè)
DWR中文文檔
MySQL 5.1參考手冊(cè)
Spring Framework 開(kāi)發(fā)參考手冊(cè)
灰狐文檔中心
搜索
積分與排名
積分 - 1330276
排名 - 20
最新隨筆
1.?Centos7安裝Nginx+PHP+MySQL
2.?Ubuntu完美安裝搭建Git服務(wù)器
3.?Git本地服務(wù)器搭建及使用詳解
4.?Linux 常見(jiàn)運(yùn)維命令
5.?Linux怎樣恢復(fù)誤刪除的數(shù)據(jù)
6.? CentOS 7 安裝 Nginx、PHP7、PHP-FPM
7.?Tomcat8 安全配置與性能優(yōu)化
8.?Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
9.?Ubuntu14.04下搭建VPN服務(wù)
10.?CentOS 6.4 配置VPN服務(wù)教程
最新評(píng)論
1.?re: Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
相當(dāng)成功
--reatang
2.?re: mysql alter 語(yǔ)句用法,添加、修改、刪除字段等
密密麻麻嗎
--,,,
3.?eettafellamp
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--eettafellamp
4.?re: 使用Spring MVC表單標(biāo)簽
水電費(fèi)
-- 低調(diào)
5.?aanrechtblad
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--aanrechtblad
6.?re: Tomcat8 安全配置與性能優(yōu)化[未登錄](méi)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--aa
7.?re: Tomcat8 安全配置與性能優(yōu)化[未登錄](méi)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--aa
8.?aa[未登錄](méi)
啊啊啊啊
--aa
9.?re: Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
可以可以可以
--司馬青衫
10.?re: mysql alter 語(yǔ)句用法,添加、修改、刪除字段等[未登錄](méi)
1111
--a
閱讀排行榜
1.?MySQL的mysqldump工具的基本用法(237571)
2.?mysql alter 語(yǔ)句用法,添加、修改、刪除字段等(166860)
3.?HttpClient 學(xué)習(xí)整理(143518)
4.?c3p0詳細(xì)配置(91825)
5.?Mysql日期和時(shí)間函數(shù)大全(61381)
6.?Hibernate 不同數(shù)據(jù)庫(kù)的連接及SQL方言(50282)
7.?iptables 開(kāi)啟80端口 (32161)
8.?AS與JS相互通信(Flex中調(diào)用js函數(shù))(26668)
9.?使用Spring MVC表單標(biāo)簽(23985)
10.?JFreeChart在JSP中的應(yīng)用實(shí)例(22546)
11.?scrollbar屬性、樣式詳解(20580)
12.?linux+nginx+tomcat負(fù)載均衡,實(shí)現(xiàn)session同步(20435)
13.?多級(jí)反向代理[Squid]下獲取客戶端真實(shí)IP地址(16396)
14.?linux rsync同步設(shè)置詳細(xì)指南(15693)
15.?jsp頁(yè)面中,JSTL El表達(dá)式字符串比較常用方法(15589)
評(píng)論排行榜
1.?南雄中學(xué)百年校慶(91)
2.?HttpClient 學(xué)習(xí)整理(44)
3.?JFreeChart在JSP中的應(yīng)用實(shí)例(29)
4.?c3p0詳細(xì)配置(26)
5.?從MySQL得到最大的性能(20)
6.?學(xué)會(huì)如何去愛(ài)一個(gè)人(16)
7.?千年珠璣(15)
8.?笑翻天樂(lè)園-痛并快樂(lè)著(14)
9.?說(shuō)說(shuō)我們技術(shù)部(13)
10.?MySQL的mysqldump工具的基本用法(12)
11.?述 職 報(bào) 告(11)
12.?多級(jí)反向代理[Squid]下獲取客戶端真實(shí)IP地址(11)
13.?雙喜臨門(mén)(10)
14.?元旦遭遇人山人海(9)
15.?一個(gè)身材超好的MM(7)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Alpha
主站蜘蛛池模板:
无码天堂va亚洲va在线va
|
亚洲色大成网站WWW久久九九
|
最近高清中文字幕无吗免费看
|
色www永久免费
|
中文日本免费高清
|
亚洲精品偷拍视频免费观看
|
乱爱性全过程免费视频
|
黄网站在线播放视频免费观看
|
另类专区另类专区亚洲
|
污视频网站在线免费看
|
四虎一区二区成人免费影院网址
|
国产jizzjizz免费视频
|
免费高清小黄站在线观看
|
免费无码看av的网站
|
日韩视频在线免费
|
又爽又高潮的BB视频免费看
|
亚洲?V无码乱码国产精品
|
亚洲国产综合人成综合网站
|
亚洲日韩在线观看免费视频
|
亚洲熟妇av一区二区三区
|
亚洲AV日韩AV永久无码下载
|
亚洲美女精品视频
|
亚洲一卡一卡二新区无人区
|
亚洲精品无码永久在线观看你懂的
|
亚洲av无码兔费综合
|
精品一区二区三区免费毛片
|
五月天婷婷免费视频
|
精品视频在线免费观看
|
最近中文字幕完整版免费高清
|
国产a视频精品免费观看
|
中文字幕av无码无卡免费
|
免费国产成人高清在线观看麻豆
|
国产午夜亚洲不卡
|
亚洲电影中文字幕
|
亚洲人成7777
|
黄页网站在线免费观看
|
中文字幕乱码一区二区免费
|
在线永久免费的视频草莓
|
国产免费小视频在线观看
|
亚洲国产成人一区二区三区
|
亚洲一区二区三区高清视频
|