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
閱讀(1627)
評論(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 開發參考手冊
灰狐文檔中心
搜索
積分與排名
積分 - 1330196
排名 - 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工具的基本用法(237570)
2.?mysql alter 語句用法,添加、修改、刪除字段等(166859)
3.?HttpClient 學習整理(143517)
4.?c3p0詳細配置(91824)
5.?Mysql日期和時間函數大全(61381)
6.?Hibernate 不同數據庫的連接及SQL方言(50282)
7.?iptables 開啟80端口 (32158)
8.?AS與JS相互通信(Flex中調用js函數)(26668)
9.?使用Spring MVC表單標簽(23985)
10.?JFreeChart在JSP中的應用實例(22545)
11.?scrollbar屬性、樣式詳解(20580)
12.?linux+nginx+tomcat負載均衡,實現session同步(20435)
13.?多級反向代理[Squid]下獲取客戶端真實IP地址(16396)
14.?linux rsync同步設置詳細指南(15693)
15.?jsp頁面中,JSTL El表達式字符串比較常用方法(15589)
評論排行榜
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)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Alpha
主站蜘蛛池模板:
又粗又硬免费毛片
|
色多多免费视频观看区一区
|
亚洲欧洲日本在线
|
三年片在线观看免费大全
|
免费在线观看一级片
|
日韩亚洲翔田千里在线
|
亚洲国产激情在线一区
|
亚洲av成人无码久久精品
|
亚洲美日韩Av中文字幕无码久久久妻妇
|
成人午夜免费福利视频
|
麻豆成人久久精品二区三区免费
|
国产成人无码免费网站
|
特级毛片A级毛片免费播放
|
亚洲熟妇无码一区二区三区导航
|
亚洲另类春色校园小说
|
久久精品国产亚洲AV无码麻豆
|
国产亚洲精品无码成人
|
亚洲伊人久久综合影院
|
亚洲а∨天堂久久精品
|
国产一区二区视频免费
|
小小影视日本动漫观看免费
|
毛片免费观看的视频在线
|
真人做人试看60分钟免费视频
|
在线观看免费av网站
|
91热久久免费精品99
|
一级毛片免费毛片一级毛片免费
|
国产成人AV免费观看
|
爽爽爽爽爽爽爽成人免费观看
|
在线视频网址免费播放
|
成人网站免费大全日韩国产
|
国产免费久久精品丫丫
|
国产精品美女久久久免费
|
亚州免费一级毛片
|
最刺激黄a大片免费网站
|
99在线在线视频免费视频观看
|
最近的中文字幕大全免费8
|
亚洲熟妇av一区二区三区
|
日韩成人毛片高清视频免费看
|
亚洲精品无码久久毛片
|
最新亚洲人成网站在线观看
|
妞干网在线免费视频
|