JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 請問 HTMLParser 擷取容器的問題 [精華]
Corroson





發文: 11
積分: 0
於 2004-08-25 13:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我在網路上找到了這個:http://htmlparser.sourceforge.net/
覺得蠻不錯的就拿來用了。但是遇到了瓶頸。

我知道我可以使用
NodeIterator it = new Parser("test.html").element(); Node x;
while(it.hasMoreNodes())
{
....
x = it.nextNode();
.....
}
來巡弋標籤內容。

但是我想要抓取 <body ....> .... </body> 這個 Node 的內容。
Document 看了老半天,還是不知道怎麼作。
可以請知道的人不吝指導一下嗎?
謝謝!


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
is_me

我是有空就寫程式的工人



發文: 96
積分: 1
於 2004-08-25 18:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
抓網頁的內容?! 好像 re
你可以找看看這個是不是你要的~~ java.util.regex.*


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
Corroson





發文: 11
積分: 0
於 2004-08-28 17:24 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
樓上那位先生,謝謝。
不過我對於 Regular Expression 實在是一竅不通。
感覺起來還是用人家寫好的 HTMLParser 比較方便。

只不過還不太會用。不知道如何取出 <body ...> ... </body> 標籤的內容。


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2004-09-24 04:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
您說的 HTMLParser API 我也是最近才發現的 ...
但還沒開始研究 ....

之前製作學校的專題時,是使用 Java Swing API 內建的 HTMLParser ...
有關這方面的資源,您可以參考 "O'reilly Java Network Programming, 2nd" !

下面的程式碼,只是擷取以前專題程式的一小部分 ...
提供您參考看看 ...
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
import java.io.*;
import java.net.*;
  
public class parseHTML extends HTMLEditorKit.ParserCallback {
  
    // 記錄是否將資料印出
    private boolean inHeader=false;
  
    public parseHTML() {}
  
    // 將 Parse HTML 後的資料印出
    public void handleText(char[] text, int position) {
       if (inHeader) {
           // 印出 xxxx => <A HREF = ....> xxxx </A>
           // xxxx => HTML Tag A 的文字 (text)
           System.out.println(text);
       }
    }
  
    // Parse HTML Start Tag
    public void handleStartTag(HTML.Tag tag, MutableAttributeSet attributes,int position) {
  
        // 分析 Tag 的重點在這行
        if (tag == HTML.Tag.BODY) {
            this.inHeader = true;
        }
    }
  
    // Parse HTML End Tag
    public void handleEndTag(HTML.Tag tag, int position) {
        if (tag == HTML.Tag.BODY) {
            inHeader = false;
        }
    }
  
    public static void main(String[] args) {
  
        ParserGetter kit = new ParserGetter();
        HTMLEditorKit.Parser parser = kit.getParser();
  
        HTMLEditorKit.ParserCallback callback = new parseHTML();
  
        try {
            // 輸入欲分析的網頁
            URL u = new URL(args[0]);
  
            // 讀入網頁
            InputStream in = u.openStream();
            InputStreamReader r = new InputStreamReader(in);
  
            // 呼叫 parse method 開始進行  Parse HTML
            parser.parse(r, callback, true);
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}


以下是 ParserGetter class 的程式碼:
1
2
3
4
5
6
7
8
9
import javax.swing.text.html.*;
  
public class ParserGetter extends HTMLEditorKit {
  
    //purely to make this methods public
    public HTMLEditorKit.Parser getParser() {
        return super.getParser();
    }
}

Java Swing API 提供的 HTMLParser 感覺上不錯用 !
分析的速度,個人覺得 "很快" !
使用上並不困難 ...


eLove edited on 2004-09-24 04:35
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
Corroson





發文: 11
積分: 0
於 2004-09-25 20:47 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
樓上那位先生,非常的感謝您!^_^

reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
f8801030





發文: 12
積分: 0
於 2004-10-02 09:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
太感謝了 去哪書來翻翻看
學起來 記起來先


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
joan680405





發文: 5
積分: 0
於 2004-11-10 00:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝大大,不過有個問題
出來的結果:
搜尋網站 ?會員中心 | 服務說明 | Yahoo!奇摩var sn_target="_blank"; var sn_URL = new Array(); sn_URL[1] = "http://tw.rd.yahoo.com/SIG=129qcmo1m/M=272998.5561030.6630276.1440217/D=tw_knews/S=152952142:N/EXP=1100103128/A=2383783/R=0/id=flash_click/*http://tw.games.yahoo.com/acergame/index.php"; var sn_link1 = "javascript:SNopenWindow(1)"; var sn_flashfile='http://tw.yimg.com/a/tw/272998/1_650x90.swf?clickTAG='+sn_link1+''; var sn_altURL="http://tw.rd.yahoo.com/SIG=129qcmo1m/M=272998.5561030.6630276.1440217/D=tw_knews/S=152952142:N/EXP=1100103128/A=2383783/R=1/id=altimg_click/*http://tw.games.yahoo.com/acergame/index.php"; var sn_altimg="http://tw.yimg.com/a/tw/wenchuan/650x90_272998_110504.gif"; var sn_width=650; var sn_height=90; 新聞?新聞首頁政治社會國際兩岸財經影視體育生活休閒科技健康新奇照片雜誌新聞首頁?>? 財經新聞 ?>?聯合新聞網2004 / 11 / 09 (星期二) ?創業 不要有太多憧憬寄給朋友   友善列印 ??【聯合新聞網 本報記者吳雯雯】 負責輔導台北銀行「樂透(新聞、網站)圓夢創業專案」的創業顧問師王舜清表示,一般人對小本創業有很多憧憬,但實際上,小本創業風險一樣很高,從「就業」到「創業」,「隔行如隔山」,事前必須充分規劃,才能順利一圓老闆夢。廣 告同賣菜八小時 山藥獲利較高王舜清以他多年輔導小本創業者的經驗指出,很多人都是先想到要開什麼店才來創業,但這個順序是錯誤的。他認為,既然創業都是「從頭學起」,因此,評估哪個產業「時間產值高」,與商圈內其他商店有市場區隔、具備互補性,才是最重要的。王舜清舉例說,他曾在某一傳統市場旁看到有位太太擺攤賣小白菜,每天從早上6點賣到下午2點,辛苦工作8小時,但小白菜一斤15元,全部賣光淨利也不過是300元左右。選對地點業別 工時短也賺錢後來王舜清建議老闆娘改賣山藥,山藥一斤叫價150至210元,獲利率一躍是10倍以上。他強調,這就所謂「時間產值」,花同樣的時間去賣菜,就要找時間產值高的產品去賣,獲利率才高。他又舉例,台北有一家「林家乾麵」,只賣乾麵、魚丸湯,每天從早上5點賣到10點,只賣早餐,一天工作5小時,但每月可賺10幾萬元,2、3年下來就賺進上千萬元的房子。這個例子說明,只要選對地點與業別,工作時間不必長,獲利一樣可以衝高,這就是「時間產值」的意義。考慮時間產值 才有時間休息王舜清表示,小本創業通常人手少,特別需要考慮「時間產值」,這樣創業者才能有時間去休息、恢復體力,否則光憑拉長時間去擴大營業額,並不划算。王舜清指出,他曾在西門町觀察一家賣麵線的攤子,夫婦兩人共同經營,每天從下午3點賣到晚上8點,一天只賣5小時。但夫婦倆動作俐落,一碗麵線出手只要15秒,等於1分鐘可以賣4碗,他們5小時的產值可能比一些小吃店賣上10小時更高。資金三切 期初只投三分之一資金規劃也是小本創業非常重要的一環。王舜清建議「三切法」,三分之一期初就投入,另三分之一做為備用金,最後三分之一留做預備的生活費及周轉金。舉例來說,如果籌措到150萬元,只能規劃做50萬元的小本生意,另50萬元必須做為創業期間的備用金,另外留下50萬元做最後的生活費、周轉之用。要預留備用金 以防周轉不靈王舜清表示,小本創業初期可能有很多需要調整的地方,第一個月的生意也未必如預期,所以一定要保留備用金。他看過一些案例,一開始就投入全數資金,結果第一個月生意不如預期,創業者信心受到打擊,第二個月仍未起色,信心開始崩潰。王舜清表示,一旦資金開始周轉不靈,創業者就很難定下心來好好經營。到了第三個月,為了家中生計,不少創業者就開始想要兼差,賺取生活費,這樣下來更無法專心經營,惡性循環、生意每下愈況。?寄給朋友   友善列印 ?財經類最新一則新聞:象牙海岸爆發軍事衝突 國貿局籲國人勿前往 (中央社 2004-11-09 23:21)焦點財經新聞•創業 不要有太多憧憬 (聯合新聞網)•洗腎 重大疾病險可理賠 (聯合新聞網)•台銀標地十九筆僅標出八筆 高雄最熱絡 (中央社)•台灣閃靈刷手 貢獻大陸香港最多 (聯合新聞網)•破除開會開到死魔咒 (聯合新聞網)更多財經新聞理財好康報報?兒童投資型保單 喊燒?到站就到家 排隊也要買?變額年金是什麼?您投資決策的好幫手?原物料行情?原油價格漲跌幅?大盤買賣力變化活 動 情 報??想賺取月入2-5萬,又不影響正職的工作嗎??涵碧樓、10000種機票飯店旅遊,統統一元搶購?線上影音圖書館,兒童最愛玩具館?史上最強防堵垃圾信攻擊的信箱?失眠?一率好貸,一次解決所有貸款煩惱!?幸福主角你來做!徵求SAVRIN廣告腳本?LV, Gucci, Coach? 誰是時尚界最愛品牌女包?上班必須使用電腦超過4hr的人要注意這件事! ?流行表款,絕對新品絕對便宜!?準系統、筆記型電腦、印表機、PDA回上一頁  TOP??會員中心∣服務說明∣Yahoo!奇摩???聯合新聞網 版權所有 ? 2004udnnews.com All Rights Reserved.雅虎國際資訊 版權所有 Copyright ? 2004Yahoo! Taiwan Inc. All Rights Reserved.隱私權政策 - 服務條款

好像body內若有語法過濾不掉咧!可以過濾嗎?
還有可以用空格來取代tag嗎?這樣才不會全連在一起,有分開的,可以做嗎?


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:joan680405]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2004-11-10 02:12 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
joan680405 wrote:
好像body內若有語法過濾不掉咧!可以過濾嗎?
還有可以用空格來取代tag嗎?這樣才不會全連在一起,有分開的,可以做嗎?


BODY 內的語法 !? 指什麼 ??
什麼是 "用空格來取代tag" ??

你可以針對你需要的 tag 做分析,不要一次將 body 內的 text 都抓出來 !
這樣資料就不會全連在一起了 ...
必要時,可以更改 "輸出" 的方式,或是再針對分析後的資料,再做整理,再輸出 ..


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:joan680405]
webberhan





發文: 29
積分: 0
於 2004-11-10 11:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
joan680405 wrote:
好像body內若有語法過濾不掉咧!可以過濾嗎?
還有可以用空格來取代tag嗎?這樣才不會全連在一起,有分開的,可以做嗎?


i think javax.swing.text.html.HTMLEditorKit is the better way to parse HTML.
this example will show you how to omit the tag, how to omit the text in a specific tag(e.g. <STYLE>Wink and how to replace tag with space

FYI

test.rar (1.15k)

test.rar (1.15k)


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
vagrant





發文: 1
積分: 0
於 2005-01-28 16:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果要把url提取出来怎么做啊?是用MutableAttributeSet的href么?具体怎么做呢?

reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:f8801030]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-04-30 12:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
想請教一下Swing裡HtmlParser的問題,
我無法利用handlerStartTag取得表格裡的超連結,
但一般的超連結都沒有問題喔!
是否HtmlParser無法支援巢狀語法呢?

1
2
3
4
5
<table>
    <tr> 
        <td bgcolor=9CCE9C class=menu align=center><font color=ffffff><a href=/service/cooperate.asp>網站合作</a> | <a href=/service/ad.asp>刊登廣告</a> | <a href=/service/privacy.asp>隱私權聲明</a> | <a href=mailto:service@oursweb.net>服務信箱</a></font></td>
    </tr>
</table>


我的handleStartTag程式碼
1
2
3
4
if (tag.equals(HTML.Tag.A)) {
        Object value = set.getAttribute(HTML.Attribute.HREF);
        String stringLink = (fixToAbsoluteUrl(value)).trim();  
}


ccli0709 edited on 2005-04-30 12:36
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-02 08:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
是否HtmlParser無法支援巢狀語法呢?

可以的 ..
你的使用方法有一點小問題 ..

下面這個方式可以改善你的問題:
1. 先取得該 Tag 所有屬性名稱
2. 分析屬性名稱
3. 若符合 HTML.Attribute.HREF,才會被印出
4. 再對取出的 url 做處理,使得它為一個完整的 url

1
2
3
4
5
6
7
8
9
Enumeration e = attributes.getAttributeNames();
while (e.hasMoreElements()) {
    Object name = e.nextElement();
    String value = (String) attributes.getAttribute(name);
    
    // 符合 <A HREF = "xxxx"> 屬性的字串,xxxx 會被印出
     if (name == HTML.Attribute.HREF) {
           System.out.println("HREF = " + value);
}


reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-05-02 18:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝~真是獲益良多呢~
但因為這兩天急用,
因此已經全部改用htmlparser,
覺得htmlparser的功能較多,
不過似乎比較慢.
而且請問怎麼解決編碼的問題?
1
2
3
4
5
6
7
8
9
10
11
org.htmlparser.util.EncodingChangeException: character mismatch (new: ? [0xd2] != old:  [0x73e7珧]) for encoding change from Big5 to ISO-8859-1 at character offset 21
  at org.htmlparser.lexer.InputStreamSource.setEncoding(InputStreamSource.java:267)
  at org.htmlparser.lexer.Page.setEncoding(Page.java:773)
  at org.htmlparser.tags.MetaTag.doSemanticAction(MetaTag.java:119)
  at org.htmlparser.scanners.TagScanner.scan(TagScanner.java:69)
  at org.htmlparser.scanners.CompositeTagScanner.scan(CompositeTagScanner.java:160)
  at org.htmlparser.util.IteratorImpl.nextNode(IteratorImpl.java:92)
  at org.htmlparser.Parser.extractAllNodesThatMatch(Parser.java:553)
  at StaticOnePageCollector.analysisObject(StaticOnePageCollector.java:81)
  at StaticOnePageCollector.setStaticObject(StaticOnePageCollector.java:56)
  at StaticOnePageCollector.main(StaticOnePageCollector.java:342)


ccli0709 edited on 2005-05-02 19:21
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-02 19:52 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
因此已經全部改用htmlparser,
覺得htmlparser的功能較多,
不過似乎比較慢.
而且請問怎麼解決編碼的問題?

你沒有貼出 Code ?
怎知你是用啥方式 parse ?

一般應該是使用 Parser 吧 !?

1
2
3
Parser parser = new Parser();
parser.setURL("http://www.javaworld.com.tw");
parser.setEncoding("BIG5");

在開始分析網頁之前,先做上述動作,就可以解決了 ..

ps:
HTMLParser 對於"非英語系"的網頁會有編碼的問題 ..


reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-05-02 20:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
真是抱歉,我跟您寫的方法是相同的,
因為先前有人貼過,我就沒再貼了.
我的目標群是針對國內網站,
一開始我也以為寫成這樣就可以.
1
parser.setEncoding("BIG5");


但今天弄到一個大陸網站,
又出現我先前貼的那個例外,
難道沒有萬無一失的方法嗎?

如果先去解析META裡的編碼,
1
<meta http-equiv="Content-Type" content="text/html; charset=big5" />

預先在Parser裡設定的話,
是否就完全解決了呢?


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-02 22:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
真是抱歉,我跟您寫的方法是相同的,
因為先前有人貼過,我就沒再貼了.
我的目標群是針對國內網站,
一開始我也以為寫成這樣就可以.

但今天弄到一個大陸網站,
又出現我先前貼的那個例外,
難道沒有萬無一失的方法嗎?
嗯 .. 如果是用 HTMLParser 的話 ..
HTMLParser 似乎都會使用到 Parser 來做為分析網頁的必需步驟 ..
除非網頁是英語系的,不然應該都會有編碼的問題 ..

萬無一失的方法呀 ... 可以考慮用 Swing HTML Parser ..
不需考慮"語系"的問題 ..

其實若要 parse 的功能不是很複雜的話,大致上 Swing 提供的應該是足夠了 ..

如果先去解析META裡的編碼,
1
<meta http-equiv="Content-Type" content="text/html; charset=big5" />

預先在Parser裡設定的話,
是否就完全解決了呢?
這個方法不錯 .. 應該是能解決 ..
雖然我只試過國內網站,大陸網站還沒測試過 ..

之前我有 po 過一篇 HTMLParser 的使用心得,您可以參考看看 ..
Swing HTML Parser 與 HTMLParser 各有獨到之處 ..


reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-05-02 23:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
抱歉,真是愈問愈多了...

在htmlparser預設的tag裡,
找不到對於幾項標籤的解析,
1
font,b,i,u

其實用regex來做的話是沒問題,
但總是想要統一規格,
目前這部份就用HTMLEditorKit來完成,
但也是不死心地做過下列嘗試.

我參考SpanTag及其他的原始碼,
並將之修改如下:
(因為我想<b></b>和<span></span>的型態相同)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class EmphasizeTag extends CompositeTag {
 
  private static final String[] mIds = new String[] { "B" };
 
  public EmphasizeTag() {
  }
 
  public String[] getIds() {
    return (mIds);
  }
 
  public String[] getEnders() {
    return (mIds);
  }
}


結果什麼都找不到,
唔...我太天真了嗎?


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-03 06:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
抱歉,真是愈問愈多了...
不會啦 .. 這樣討論很好啊 ..
互相分享與學習!
我參考SpanTag及其他的原始碼,
結果什麼都找不到,
唔...我太天真了嗎?
你是如何使用自訂的 Tag 去做分析 ?

目前不清楚,Tag 是否有跟其它 class 相關連 ..
也許 "自訂的 Tag" 還要跟某個 class 註冊吧 ..

還未試過使用自訂的 Tag 做分析 ..
不過我知道下列幾種使用內建 Tag 來分析的方法,提供你參考 ..
你可以試試,看能不能有作用 ..

1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 使用 ObjectFindingVisitor 配合不同的 Tag.class 分析網頁
try {
    ImageTag imgLink;
    ObjectFindingVisitor visitor = new ObjectFindingVisitor(ImageTag.class);
    Parser parser = new Parser();
    parser.setURL(url);
    parser.setEncoding(parser.getEncoding());
    parser.visitAllNodesWith(visitor);
    Node[] nodes = visitor.getTags();
    for (int i = 0; i < nodes.length; i++) {
        // ImageTag
        imgLink = (ImageTag) nodes[i];
        // "http://www.msn.com.tw/webinclude/zh-tw/images/msn.gif" => ImageURL
        System.out.println("ImageURL = " + imgLink.getImageURL());
        // "/webinclude/zh-tw/images/msn.gif" => ImageLocation
        System.out.println("ImageLocation = " + imgLink.extractImageLocn());
        // SRC value
        System.out.println("SRC = " + imgLink.getAttribute("SRC"));
    }
} catch (Exception e) {
    e.printStackTrace();
}

2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 使用不同的 NodeFilter 分析網頁
try {
    NodeFilter filter = new TagNameFilter("IMG");
    NodeFilter filter1 = new NodeClassFilter(ImageTag.class);
    Parser parser = new Parser();
    parser.setURL(url);
    parser.setEncoding(parser.getEncoding());
    NodeList list = parser.extractAllNodesThatMatch(filter);
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.elementAt(i).toHtml());
    }
} catch (Exception e) {
    e.printStackTrace();
}

3.
1
2
3
4
5
6
7
8
9
10
11
12
13
// 直接使用 Tag.class 分析網頁
try {
    Parser parser = new Parser();
    parser.setURL(url);
    parser.setEncoding(parser.getEncoding());
    Node[] nodes = parser.extractAllNodesThatAre(ImageTag.class);
    for (int i = 0; i < nodes.length; i++) {
        ImageTag imageTag = (ImageTag) nodes[i];
        System.out.println(imageTag.getImageURL());
    }
} catch (Exception e) {
    e.printStackTrace();
}


eLove edited on 2005-05-04 12:06
reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-05-03 07:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
既然您都這樣說,
那就不客氣了!:D

我想我要的就是你說的第二項吧~
真的是什麼TAG都抓得出來.
我原本說的自訂標籤是利用filter1的寫法,
去增加一個自己的Tag物件啦~
看來也不需要了...:P
1
2
3
4
5
6
7
8
9
10
// 使用不同的 NodeFilter 分析網頁
NodeFilter filter = new TagNameFilter("IMG");
NodeFilter filter1 = new NodeClassFilter(ImageTag.class);
Parser parser = new Parser();
parser.setURL(url);
parser.setEncoding("BIG5");
NodeList list = parser.extractAllNodesThatMatch(filter);
for (int i = 0; i < list.size(); i++) {
   System.out.println(list.elementAt(i).toHtml());
}


另外,請問您是怎麼知道這樣子的方法呢?
在它所附的四個範例中,
沒看到像您所寫的三個如此字字珠璣.
這條魚很鮮美,
能否告訴我是怎麼釣到的呢?

感恩...


browser edited on 2005-05-03 10:14
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-03 11:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
我想我要的就是你說的第二項吧~
真的是什麼TAG都抓得出來.
我原本說的自訂標籤是利用filter1的寫法,
去增加一個自己的Tag物件啦~
看來也不需要了...Tongue
HTMLParser 的範例內有用到的 NodeFilter 就二個而已 .. (有印象的啦)
後來去翻 API 來仔細的看,發現有一堆 NodeFilter,名稱命名又很直覺 ..
那時候第一個測試的 Tag 就是 "IMG" ..
並配合 TagNameFilter ..
沒想到它是什麼 Tag 都能抓 ..
呵 .. 誤打誤撞啊 ~
總之,能解決問題就好!

剛剛又回頭看了一次 API,TagNameFilter 的註解是:
Creates a new instance of TagNameFilter that accepts tags with the given name.
看來它確實是用來建立自訂 Tag 用的 ..

另外,請問您是怎麼知道這樣子的方法呢?
在它所附的四個範例中,
沒看到像您所寫的三個如此字字珠璣.
這條魚很鮮美,
能否告訴我是怎麼釣到的呢?

感恩...
字字珠璣 !? 不敢當呀 ... 偶沒有那麼行啦 ...

你說的四個範例是指 "src\org\htmlparser\parserapplications" 這個嗎 ?
其實除了上述資料夾,還有一個 "src\org\htmlparser\beans",另外其它資料夾也有可以參考的地方,原始檔裡包含了不少使用的方法 ..

我是將 HTMLParser 的 parse 過程研究一番後,發現它的過程滿複雜的,一堆 class 都有關連,但主要的步驟經過歸納後,其實就那幾個 ..
最後,我把主要最常用的步驟整理出來,方便日後參考 ..
免得要用時,忘了怎麼使用 ..

心得就是 ..
這些公開、免費的 API,它的文件說明感覺上都很少 ..
想了想,不如試著依照範例,一個一個的把 class 的原始碼開來看 ..
研究 class 之間彼此的關連、使用方式 ..
重點在於 "流程的理解" ..
一旦理解後,再配合 API 文件,不難發現該 API 的使用方式 ..

對於像 HTMLParser 這種也算有點規模的,先從最簡單、常用的功能,配合原始碼,可發現不少隱藏在其中的 "鮮美的魚" ..

以上個人經驗,提供你參考 ..


reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-04 11:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
如果先去解析META裡的編碼,
1
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
預先在Parser裡設定的話,
是否就完全解決了呢?
發現 HTMLParser 提供一個方法,能取得 "網頁的編碼" ..
只要在 parse 前,預先設定,就可以正確的 parse 網頁了 ..
不必自己手動解析 ..

提供參考!

1
2
3
4
5
String url = "http://www.javaworld.com.tw/jute/index.html";
Parser parser = new Parser();
parser.setURL(url);
System.out.println("Page Encoding = " + parser.getEncoding());
parser.setEncoding(parser.getEncoding());


reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-05-04 15:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
呵~原來加這句就好囉~
可是似乎沒效呢~
例外還是一直出來.


ccli0709 edited on 2005-05-04 19:37
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-05 12:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
呵~原來加這句就好囉~
可是似乎沒效呢~
例外還是一直出來.
如果 HTMLParser 找不到 meta 裡 charset 的設定值,出現 "例外" 應該是正常的 ..
(本來我是想說目前的網頁,應該都會有 charset 的設定,所以我就沒有提到這一點了)

我測試一些含有 charset 的網頁,這個方法確實是免於擔心 charset 問題所引發的 "例外狀況" ..
不過還是會有例外 .... 就是 HTMLParser 有時候會誤判 ...

另外,你之前 po 的文章有寄至我的信箱 ..
不知道為什麼改掉了 !?
想說你問了,就討論一下吧 .. ^___^

你提到關於 "巢狀語法",如:<table> 裡含有 <a> 或者其它的 Tag ..
其實 Swing HTML Parser 跟 HTMLParser 的運作方式不太一樣 ..

舉例來說 <A> 這個 Tag:
1.
HTMLParser 並非單純以 Tag 的名稱去擷取的 ..
這一點 HTMLParser 使用上就方便許多 ..
只要使用 LinkTag 去分析即可 ..
2.
Swing 則要指定 HTML.Tag.A 再比對是否為 HTML.Attribute.HREF,才對 HREF 做處理 ..
有點像是,一步一步漸進處理 ..
HTMLParser 則是幫使用者處理掉了 ..

以下附上程式碼:

Swing - handleStartTag()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Parse HTML Start Tag
public void handleStartTag(HTML.Tag tag, MutableAttributeSet attributes, int position) {
    // 分析 Tag 的重點在這行
    if (tag == HTML.Tag.A) {
        // 以下是針對 Tag 再做額外的處理 ----
        try {
             Enumeration e = attributes.getAttributeNames();
             while (e.hasMoreElements()) {
                 Object name = e.nextElement();
                 String value = (String) attributes.getAttribute(name);
                 
                 // 符合 <A HREF = "xxxx"> 屬性的字串,xxxx 會被印出
                    if (name == HTML.Attribute.HREF) {
                      System.out.println("HREF = " + value);
                 }
             }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        this.inHeader = true;
   }
}

HTMLParser - LinkTag
1
2
3
4
5
6
7
8
9
10
11
12
try {
    Parser parser = new Parser();
    parser.setURL(url);
    parser.setEncoding(parser.getEncoding());
    Node[] nodes = parser.extractAllNodesThatAre(LinkTag.class);
    for (int i = 0; i < nodes.length; i++) {
        LinkTag link = (LinkTag) nodes[i];
        System.out.println(link.getLink());
    }
} catch (Exception e) {
    e.printStackTrace();
}


ps:
http://www.oursweb.net/
<table> 裡的 <a>,有試過 Swing 來分析,是可以擷取出來的 ..


reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:eLove]
ccli0709

ccli0709



發文: 46
積分: 1
於 2005-05-06 13:11 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
唔∼因為那個問題是我自己的問題,
之所以會誤認為Swing HTMLParser沒抓到<table>裡的<a>
是因為目標網頁使用了轉址將網頁導向到別的網頁,
Swing HTML Parser看到的網頁就跟我用瀏覽器看到的不同,
才會發生這個誤會∼
我怕被你笑話才會快點改回來,
想不到還是被看到了!
===
我的程式現在全部使用Swing HTML Parser,
因為HTML Parser的例外出現到令我恐慌的地步。
===
我要做的是自動解析一堆網站,
問題一:如果是要找出一個網站裡所有的網頁,
在我認為是很困難的事,當然如果時間不限,
是可以跑出來沒錯啦∼
問題二:測試某個連結或圖片是否存活,
我是去建立URLConnection來取得回傳的代碼,
若為百位數為4便認定其為斷掉的連結。
但資料一多,有時一個網頁會有到400個連結,
這麼一來時間又拖得很長∼
若利用URL.OpenStream()的例外來處理,
似乎也是一樣慢,而且感覺會有後遺症。
===
不知道你有什麼好方法可以再教我呢?
是你自己說可以一直問的喔!Big Smile


reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:ccli0709]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2005-05-06 14:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ccli0709 wrote:
因為目標網頁使用了轉址將網頁導向到別的網頁,
Swing HTML Parser看到的網頁就跟我用瀏覽器看到的不同,
才會發生這個誤會∼
我怕被你笑話才會快點改回來,
想不到還是被看到了!
原來如此呀 ..
想說怎麼會抓不到 ..
呵 .. 怎麼會笑你呢 .. 不會的啦 ~
人難免會有失誤的時候 ..
偶自己寫程式時,也是會出現一堆很怪的錯誤,結果是自己搞錯了 !
我的程式現在全部使用Swing HTML Parser,
因為HTML Parser的例外出現到令我恐慌的地步。
是喔 ..
HTMLParser 的例外是指 "編碼問題" 嗎 ?
我要做的是自動解析一堆網站,
問題一:如果是要找出一個網站裡所有的網頁,
在我認為是很困難的事,當然如果時間不限,
是可以跑出來沒錯啦∼
用 threads 來解決 ..
先從首頁下手,每抓到一個連結,就再以那個連結為起始,啟動 thread 接著往下搜尋 ..
可以把一些固定程序整理出來,只改變可能例外的地方 ..
這樣的話,threads 的控制難度可以降低許多 ..

src\org\htmlparser\lexerapplications\thumbelina
你可以參考這個程式的做法 ..
它是用來把網頁裡,所有的圖片檔抓出來,並顯示出來 ..

我測試過,很恐怖 .......
一直抓下去,不會停 .... 不知道停止條件是什麼 !?

問題二:測試某個連結或圖片是否存活,
我是去建立URLConnection來取得回傳的代碼,
若為百位數為4便認定其為斷掉的連結。
但資料一多,有時一個網頁會有到400個連結,
這麼一來時間又拖得很長∼
若利用URL.OpenStream()的例外來處理,
似乎也是一樣慢,而且感覺會有後遺症。
===
不知道你有什麼好方法可以再教我呢?
是你自己說可以一直問的喔!:D
URLConnection 沒有 TimeOut 這類的設定 ..
它的預設值滿久的 .. 靠它的回傳值,也是要等 ..

解決方案有兩個:
-> 1. 設定網路屬性
1
2
System.setProperty("sun.net.client.defaultReadTimeout", "7000");
System.setProperty("sun.net.client.defaultConnectTimeout", "7000");
這個是在 bbs 討論區看到的 .. 單位是毫秒(ms) ..
但自己沒測試過 ..

-> 2. Apache Commons HTTPClient
它提供 HTTP TimeOut 的功能 ..

以下是使用 HTTP TimeOut 的程式碼:
單位是毫秒(ms) ..
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
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.*;
   
 
public class HTTPTimeOut {
   
 
    public static void main(String[] args) {
   
 
        String url = "http://203.187.1.180/allenkao/ppmusic/tg290-20050429.rar";
        int time = 3000;
   
 
        HttpClient client = new HttpClient();
        client.setTimeout(time);
        GetMethod method = new GetMethod(url);
   
 
        try {
            client.executeMethod(method);
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

例外訊息:
1
2
3
4
5
2005/5/6 下午 01:57:53 org.apache.commons.httpclient.HttpMethodBase processRequest
資訊: Recoverable exception caught when processing request
2005/5/6 下午 01:57:53 org.apache.commons.httpclient.HttpMethodBase processRequest
警告: Recoverable exception caught but MethodRetryHandler.retryMethod() returned false, rethrowing exception
org.apache.commons.httpclient.HttpRecoverableException: java.net.SocketTimeoutException: Read timed out
超過 TimeOut 設定的時間,retry 失敗的話,會丟出例外 ..
這個是測試 giga (和信超媒體) 的連結 ..


eLove edited on 2005-05-06 14:35
reply to postreply to post
既不回頭, 何必不忘
若是無緣, 何需誓言
昨日種種, 似水無痕
明夕何夕, 君已陌路
go to first page go to previous page  1   2   3  go to next page go to last page
» JWorld@TW »  Java SE 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8