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 開發參考手冊
灰狐文檔中心
搜索
積分與排名
積分 - 1330093
排名 - 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工具的基本用法(237568)
2.?mysql alter 語句用法,添加、修改、刪除字段等(166857)
3.?HttpClient 學習整理(143515)
4.?c3p0詳細配置(91822)
5.?Mysql日期和時間函數大全(61379)
6.?Hibernate 不同數據庫的連接及SQL方言(50281)
7.?iptables 開啟80端口 (32157)
8.?AS與JS相互通信(Flex中調用js函數)(26666)
9.?使用Spring MVC表單標簽(23983)
10.?JFreeChart在JSP中的應用實例(22543)
11.?scrollbar屬性、樣式詳解(20577)
12.?linux+nginx+tomcat負載均衡,實現session同步(20433)
13.?多級反向代理[Squid]下獲取客戶端真實IP地址(16394)
14.?linux rsync同步設置詳細指南(15691)
15.?jsp頁面中,JSTL El表達式字符串比較常用方法(15588)
評論排行榜
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
主站蜘蛛池模板:
免费日本一区二区
|
eeuss草民免费
|
成人黄色免费网站
|
亚洲成人在线免费观看
|
最近中文字幕完整免费视频ww
|
老汉色老汉首页a亚洲
|
2021精品国产品免费观看
|
亚洲色图.com
|
成人影片麻豆国产影片免费观看
|
亚洲五月综合缴情婷婷
|
天天摸夜夜摸成人免费视频
|
亚洲韩国精品无码一区二区三区
|
国产午夜亚洲精品
|
成全视频免费高清
|
国产亚洲视频在线观看
|
www亚洲一级视频com
|
二区久久国产乱子伦免费精品
|
曰韩亚洲av人人夜夜澡人人爽
|
久久免费视频观看
|
亚洲剧场午夜在线观看
|
国内大片在线免费看
|
最好2018中文免费视频
|
亚洲精品亚洲人成人网
|
国产精品1024永久免费视频
|
国产一级淫片a视频免费观看
|
免费又黄又爽又猛大片午夜
|
久久99国产亚洲高清观看首页
|
久久午夜羞羞影院免费观看
|
一本色道久久88亚洲精品综合
|
免费一级国产生活片
|
免费高清国产视频
|
亚洲AV成人影视在线观看
|
亚洲另类少妇17p
|
99re免费在线视频
|
日韩成人精品日本亚洲
|
国产成人亚洲综合色影视
|
在线jyzzjyzz免费视频
|
在线毛片片免费观看
|
亚洲高清一区二区三区电影
|
久久久久久久尹人综合网亚洲
|
免费永久国产在线视频
|