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年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
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(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 開發參考手冊
灰狐文檔中心
搜索
積分與排名
積分 - 1330162
排名 - 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詳細配置(91823)
5.?Mysql日期和時間函數大全(61381)
6.?Hibernate 不同數據庫的連接及SQL方言(50282)
7.?iptables 開啟80端口 (32158)
8.?AS與JS相互通信(Flex中調用js函數)(26667)
9.?使用Spring MVC表單標簽(23984)
10.?JFreeChart在JSP中的應用實例(22545)
11.?scrollbar屬性、樣式詳解(20579)
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
主站蜘蛛池模板:
成人爱做日本视频免费
|
日韩欧美一区二区三区免费观看
|
免费少妇a级毛片
|
色噜噜噜噜亚洲第一
|
韩国二级毛片免费播放
|
亚洲精华国产精华精华液好用
|
搡女人真爽免费视频大全
|
亚洲欧洲国产综合AV无码久久
|
免费观看男人免费桶女人视频
|
亚洲欧洲精品成人久久曰
|
五月婷婷亚洲综合
|
色婷婷综合缴情综免费观看
|
久久久久亚洲精品男人的天堂
|
精品一区二区三区高清免费观看
|
亚洲无线码在线一区观看
|
rh男男车车的车车免费网站
|
亚洲人成网亚洲欧洲无码久久
|
午夜网站在线观看免费完整高清观看
|
亚洲国产精品一区二区久久
|
久九九精品免费视频
|
亚洲AV无码一区二区三区网址
|
jizzjizz亚洲
|
日本免费中文字幕
|
97久久国产亚洲精品超碰热
|
国产一区二区三区免费在线观看
|
jizz免费在线影视观看网站
|
亚洲AV无码精品无码麻豆
|
免费看污成人午夜网站
|
午夜亚洲乱码伦小说区69堂
|
久久夜色精品国产亚洲
|
成人永久免费高清
|
怡红院免费全部视频在线视频
|
亚洲激情视频网站
|
男人的天堂亚洲一区二区三区
|
永久在线观看免费视频
|
亚洲国产高清在线精品一区
|
免费播放春色aⅴ视频
|
久久久久久久久久国产精品免费
|
最新国产精品亚洲
|
亚洲国产精品一区二区第一页
|
亚洲成在人线aⅴ免费毛片
|