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

» JWorld@TW » Java SE 討論區  

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

ccli0709



發文: 46
積分: 1
於 2005-05-06 14: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
這裡補充一下瀏覽網站的心得,
若全然都是.html是沒什麼問題,
若是以動態語法完成的網頁,
我也是用把整個連結包括參數一起送出去,
再截取得到的html檔來做分析。
遇到很極端的像是,
整個網站只有兩支.php檔,
利用送出module參數來完成所有的功能,
要用參數來抓的話會有很多連結,
若不考慮參數的話卻只有看到那個.php檔。
不然就是裡頭有數千個網頁。
我想取用前100個網頁來做就好,
但老師認為我還是再試試找出所有網頁.
程式是有啦,要我放上來嗎?
但只取前100個網頁的話,
還是會有跑到停掉的可能。


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

若我不在你身邊



發文: 124
積分: 3
於 2005-05-06 15: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
ccli0709 wrote:
不然就是裡頭有數千個網頁。
也難怪你會對 HTMLParser 的例外感到恐慌 ....
我想取用前100個網頁來做就好,
但老師認為我還是再試試找出所有網頁.
程式是有啦,要我放上來嗎?
但只取前100個網頁的話,
還是會有跑到停掉的可能。
也就是說,目前卡在 "網頁可能停掉" 的部分囉 ?
抓過哪些網頁,處理起來很麻煩的 ?
程式 po 上來看看 ..


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

ccli0709



發文: 46
積分: 1
於 2005-05-07 17:17 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
我回來了~
在這裡附上可執行的jar檔,
內含原始碼.

MySpider.jar (46.74k)


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

若我不在你身邊



發文: 124
積分: 3
於 2005-05-09 12:54 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:
在這裡附上可執行的jar檔,
你是從下面網址抓出網站排名,再分析各排名網站的資料,對吧?
1
http://rank.hotrank.com.tw/rank.php?rpt=bysea&sea=200404&category=XXXX&page=X
其中 category 與 page 是動態指定的 ..
發現二個地方:
1. WebsiteParserCallback
分析出 "一個 SRC / HREF" 後,就執行 getAbsoluteHyperlink() 轉換 Link ..

2. OnePageParserCallback
分析出 "一個 SRC" 後,就測試圖片連結是否存在 ..

以上兩個地方,提供我過去的經驗 ..
Swing HTML Parser 分析速度其實滿快的!
在處理分析 Tag 的同時,儘量淢少其它轉換或測試的動作 ..
也就是讓它分析完欲分析的 Tag,再將這些資料另存 ..
接著再做後續欲轉換或測試的動作 ..
這樣執行效率會提高許多 ..
比較不會卡在分析 Tag 的地方 ..
而這些獨立出來,轉換或測試的地方,可以做到更好的控制!
像是測試連結存活的部分,改採 threads,一次執行數個測試 ..
應該會比一次分析一個 Tag 再測試連結,快上許多 ..

若全然都是.html是沒什麼問題,
若是以動態語法完成的網頁,
我也是用把整個連結包括參數一起送出去,
再截取得到的html檔來做分析。
遇到很極端的像是,
整個網站只有兩支.php檔,
利用送出module參數來完成所有的功能,
要用參數來抓的話會有很多連結,
若不考慮參數的話卻只有看到那個.php檔。
不然就是裡頭有數千個網頁。
這個部分,解讀完你的程式後,終於了解你的難處 .....
先分析網站排名,再處理各網站的統計資料 ..
而每個網站的網頁下載方式不一定相同,又還會發生連結失敗的情形 ..
唔 ..... 光是這點,頭就大了 ..

目前也只想到一個點子 ..
1. 分析、測試、轉換獨立出來
2. 針對網頁下載的方式,看看是否能整理出幾個固定的模式
3. 使用不同的下載方法,配合固定分析、測試、轉換方法
4. 對這些下載方法及配合的分析、測試、轉換方法,做說明

我想你的老師應該會諒解你的難處 ..

ps:
呵 ~~ 點子太爛,勿見怪 .. sorry ..


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

ccli0709



發文: 46
積分: 1
於 2005-05-09 17:09 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
真是太感動了,(淚)
你真的去看我的程式碼,
希望小弟拙劣的寫法不會傷到你的目睭.

最花時間就是去測試連結,
Thread我有想過,
但還沒用過Thread Pool,
就是控制Thread數,
以免一下花太多Thread而造成死機.
所以不敢加進去,
能少一個錯就算一個.

超連結的測試我會想看看如何擺到最後再測,
但這得花一個空間來存放一個網站裡所有超連結,
而時間還是一樣主要花費在測試連結上面,
不知道有沒有比較划算,
我會去試的.

>>而每個網站的網頁下載方式不一定相同,又還會發生連結失敗的情形 ..
你說的不一定相同的網頁下載方式,
我不太明白.
我是認為在客戶端看到的均是html,
完全不考慮伺服端語法,
所以我均使用相同的下載方法,
就是去找出該頁所有的超連結,
1)若為內部連結,則繼續往下找,
2)若為外部連結,則測試是否連通.
純綷蠻幹的作法,
若大大你有更好的作法,
要記得跟我說喔!

再次叩首感謝你的回文.(叩首)


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

ccli0709



發文: 46
積分: 1
於 2005-05-09 22:02 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 Html Parser,
遇到一個<iframe>,
但預設的標籤沒有符合它的,
想要自訂卻又找不到方法.
真不好意思...Dead


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

若我不在你身邊



發文: 124
積分: 3
於 2005-05-11 02:44 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:
真是太感動了,(淚)
你真的去看我的程式碼,
希望小弟拙劣的寫法不會傷到你的目睭.
呵 .. 別這麼說 ..
你的寫法不會不好 .. 只是註解好少 ..
還好有 IDE 工具 ... ^_____^
Thread我有想過,
但還沒用過Thread Pool,
就是控制Thread數,
以免一下花太多Thread而造成死機.

超連結的測試我會想看看如何擺到最後再測,
但這得花一個空間來存放一個網站裡所有超連結,
而時間還是一樣主要花費在測試連結上面,
不知道有沒有比較划算,
擺到最後再測,主要是配合 threads 才能節省時間 ..
若是沒有 threads 的幫助,減少的時間,很有限 ..

>> 而每個網站的網頁下載方式不一定相同,又還會發生連結失敗的情形 ..
我的意思是指,你不是說過,有的網頁要下參數才能得到嗎 ?
所以才會這樣回覆你 .. (整個網站只有兩個 php 那一段話)
找出該頁所有的超連結,
1)若為內部連結,則繼續往下找,
2)若為外部連結,則測試是否連通.
唔 ~ 原來如此,終於了解你真實作法的意義了 ..
因為在分析你的程式,這兩點的用意一直不確定 ..
純綷蠻幹的作法,
若大大你有更好的作法,
要記得跟我說喔!
呵 .. 講到蠻幹 ..
我是直接想到就用 threads,不考慮數量了,同步的問題 ok 就行了 .. (沒考慮到你要分析的連結似乎不少)
哈 ~~ 我想這應該更蠻幹吧 .. 不過,這種作法並不好 ..
壞習慣要改正 ..

Thread Pooling 是個好方法 ..
有空來練練 .. 心得再與你分享 ..


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

ccli0709



發文: 46
積分: 1
於 2005-05-12 13:26 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
eLove大大,
這個討論串就暫時到這裡吧,
最後說一下註解太少的原因,
因為我寫得很好笑,
怕丟人現眼,
索性都刪掉了.
我的註解寫起來跟寫日記一下...Tongue


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





發文: 7
積分: 0
於 2005-08-20 11:02 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
请问如果我是想原封不动地抽取指定HTML中的部分所需源代码(例如<table>...</table>中间的所有源代码)后再在另一HTML中输出该怎么办呢?忘高手指点,急,小弟感激不尽!!!

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





發文: 1
積分: 0
於 2006-03-07 10: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
eLove wrote:

下面的程式碼,只是擷取以前專題程式的一小部分 ...
提供您參考看看 ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
        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);
        }
    }
}

恕刪...


想請問一下用HTMLEditorKit & url.openStream 有沒有方法控制connect 的timeout,我把我的paser放在swing用swing的Timer每1分鐘去connect網頁跑沒多久就會發生
1
java.io.IOException: Server returned HTTP response code: 999 for URL

的錯誤,所以考慮是否將timeout加大。可是就是找不到如何做。還是小弟的想法錯誤??


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

若我不在你身邊



發文: 124
積分: 3
於 2006-03-11 09:32 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
berton_tin wrote:
想請問一下用HTMLEditorKit & url.openStream 有沒有方法控制connect 的timeout
可參考 org.apache.commons.httpclient 有提供 setTimeout 的方法 ..
1
java.io.IOException: Server returned HTTP response code: 999 for URL
這個錯誤有點印象,好像是 Yahoo 網頁回報的錯誤 ...


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





發文: 8
積分: 0
於 2006-03-12 17:01 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

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();
}


從這個方法中我可以取出所需的部分, 但不知為何我並不能把取出的部分進行修改。
我想要的效果是將一個webpage內的<form action="123.htm">中的action 改做我想設定的url,然後再把整個檔案output番一個新的html file出來... 請問可以什麼做呢?
這是我從網上收得的方法...但做不到...Sad
1
2
3
4
5
6
7
Parser myParser = new Parser(resource);
String filterStr = "form";
NodeFilter filter = new TagNameFilter(filterStr);
NodeList nodeList = myParser.parse(null);
NodeList subList = nodeList.extractAllNodesThatMatch(filter); /*當complie回來的結果,這行出現NullPointerException*/
FormTag formTag = (FormTag)subList.elementAt(0);
formTag.setFormLocation("\"myWebPage.htm\"");


minikirk edited on 2006-03-12 17:12
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:minikirk]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2006-03-12 19:53 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
minikirk wrote:
這是我從網上收得的方法...但做不到...Sad
1
2
3
4
5
6
7
Parser myParser = new Parser(resource);
String filterStr = "form";
NodeFilter filter = new TagNameFilter(filterStr);
//NodeList nodeList = myParser.parse(null); => 這行就有問題了!!
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
FormTag formTag = (FormTag) nodeList.elementAt(0);
formTag.setFormLocation("\"myWebPage.htm\"");
請仔細看一下 API ...
查一下 "標示紅色那一行",為何有誤 ?
另外,也請你對照一下,"我的程式碼" 與 "網上收得的方法" ..
你的網上收得的方法,是有誤的 !


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





發文: 8
積分: 0
於 2006-03-13 01:53 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
eLove wrote:
請仔細看一下 API ...
查一下 "標示紅色那一行",為何有誤 ?
另外,也請你對照一下,"我的程式碼" 與 "網上收得的方法" ..
你的網上收得的方法,是有誤的 !

1
2
3
4
5
NodeList nodeList = myParser.parse(null); 
/*從api NodeList nodeList = myParser.parse()就可以取得網頁, 但我下載回來的package中,它必須要我寫入一個NodeFilter
但我需要整個網頁,並不需要filter出網頁內其中一部分,所以我在.parse()內加上null, 讓它這行中nodeList能取得我需要的整個網頁
此外...它不能只用.parse() 這method...error msg 是"org.htmlparser.Parser can not be applied to ()"
這也是我不明白的地方...*/


minikirk edited on 2006-03-13 01:56
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Corroson]
minikirk





發文: 8
積分: 0
於 2006-03-13 03:33 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
eLove大大
我的問題是
如果在一個webpage中我想修改form內的action
(我只知可用FormTag.setFormLocation("xxx.htm"))
然後再把修改後的webpage 複製一個出來
請問應如何做才行呢?~
可否指教一下,謝謝~


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

若我不在你身邊



發文: 124
積分: 3
於 2006-03-27 03:18 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
minikirk wrote:
NodeList nodeList = myParser.parse() 就可以取得網頁
這行可取得網頁 ?
但我下載回來的 package 中,它必須要我寫入一個 NodeFilter
你下載回來的 package ?
但我需要整個網頁,並不需要filter出網頁內其中一部分
如果你需要的是整個網頁,而且並不需要 "filter 出網頁內其中一部分",就不必使用 HTML Parser 了 ....

所以我在.parse()內加上null, 讓它這行中nodeList能取得我需要的整個網頁
基本上,你已經誤會 HTML Parser 的運作方式 ....
NodeList 並不是用來 "取得整個網頁" 用的 !
它是根據 "指定的 filter 或 Tag.Class",配合 Parser 來取得 "該段 HTML 的內容" .. (請參考我之前 po 的三個使用 parser 程式碼範例)

NodeList nodeList = myParser.parse(null);
它不能只用.parse() 這method...error msg 是"org.htmlparser.Parser can not be applied to ()"
這也是我不明白的地方...
API 已經清楚的描述:
org.htmlparser.Parser
public void parse(NodeFilter filter) throws ParserException
Parse the given resource, using the filter provided.


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

若我不在你身邊



發文: 124
積分: 3
於 2006-03-27 03:26 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
minikirk wrote:
我的問題是
如果在一個webpage中我想修改form內的action
(我只知可用FormTag.setFormLocation("xxx.htm"))
然後再把修改後的webpage 複製一個出來
請問應如何做才行呢?~
可否指教一下,謝謝~
其實你的需求,根本不需要 "HTML Parser" ..
你只是想 "置換原 WebPage 的部分內容" ..
請參考 Regular Expression !


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





發文: 4
積分: 0
於 2006-04-21 00:44 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
請問大大,看了你們一系列的這些討論後我也使用了大大所交的paser的方法
1
2
3
4
5
6
   public void handleText(char[] text, int position) {
      if (inHeader) {  
  System.out.println(text);  
       }
   }
...

在JSP的語法下,上面這些是要寫在<%!...%>裡面,但是這樣的話JSP並無法
PRINT出來,只能compiler,小弟希望是要把他傳出來不曉得有哪些方法可以用出來到<%...%>下
或是
1
2
3
      InputStreamReader r = new InputStreamReader(is);
      // 呼叫 parse method 開始進行  Parse HTML
            parser.parse(r, callback, true);

parser.parse(r, callback, true)這個是否可以把值傳回,抱歉因為不太熟這方面
的類別,所以我不曉得他是不是傳回了


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

若我不在你身邊



發文: 124
積分: 3
於 2006-04-23 00: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
bear1alex1 wrote:
小弟希望是要把傳出來
你想要 "傳出來" 什麼東西 ??
不曉得有哪些方法可以用出來到<%...%>下
用什麼出來到 <%...%> ??
這個是否可以把值傳回,抱歉因為不太熟這方面的類別,所以我不曉得他是不是傳回了
你要問的是什麼 ? 想傳回什麼值 ?


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





發文: 4
積分: 0
於 2006-04-26 16:29 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
bear1alex1 wrote:
小弟希望是要把他傳出來
你想要 "傳出來" 什麼東西 ??

不曉得有哪些方法可以用出來到<%...%>下
用什麼出來到 <%...%> ??

這個是否可以把值傳回,抱歉因為不太熟這方面的類別,所以我不曉得他是不是傳回了
你要問的是什麼 ? 想傳回什麼值 ?

不好意思~小弟是想把char[] text這個東西拿出來,因為在<%! ... %>裡面
他將無法顯示在JSP的網頁上面,只能在Tomcat上面跑出來而已,小弟不知
道怎麼讓她放在<% ... %>非宣告下面,因此才可以在網頁上顯示出來,謝


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





發文: 1
積分: 0
於 2006-07-13 12: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
請問使用 Java Swing API 內建的 HTMLParser
handleText()是如何處理原始碼body內的"& nbsp ",
好像原始碼內出現& nbsp,輸出都是"?",似乎是亂碼

謝謝


clwang05 edited on 2006-07-13 12:59
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:clwang05]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2007-08-13 15: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
clwang05 wrote:
請問使用 Java Swing API 內建的 HTMLParser
handleText()是如何處理原始碼body內的"& nbsp ",
好像原始碼內出現& nbsp,輸出都是"?",似乎是亂碼
最近因為這篇討論
http://www.javaworld.com.tw/jute/post/view?bid=29&id=201731&tpg=1&ppg=1&sty=1&age=0
讓我回想起來這個問題,經過測試後,發現輸出 "?" 的原因 !

假設網頁編碼是 UTF-8,在 parser.parse() 之前,有使用正確編碼的 Reader
1
InputStreamReader br = new InputStreamReader(new FileInputStream("Test.html"), "UTF-8");

那麼在輸出 handleText() 的 char[] text 時,也是使用 UTF-8 的話,"& nbsp" 就是"空一格"。
可以再輸出到 Console (預設編碼是 MS950),此時 "& nbsp" 就會是 "?"。


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





發文: 1
積分: 0
於 2007-09-02 16: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
請問各位
小弟 現在遇到 一個問題
我貼給你們看
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
import java.io.*;
import java.net.*;
import java.util.Enumeration;

public class parseHTML extends HTMLEditorKit.ParserCallback {

// 記錄是否將資料印出
private boolean inHeader=false;
  Object name;
  String value;

  public parseHTML(){}

public void parseCall(String str_url)
  {
ParserGetter kit = new ParserGetter();
HTMLEditorKit.Parser parser = kit.getParser();

HTMLEditorKit.ParserCallback callback = new parseHTML();

try {
// 輸入欲分析的網頁
URL u = new URL(str_url);

// 讀入網頁
InputStream in = u.openStream();
InputStreamReader r = new InputStreamReader(in);
      
// 呼叫 parse method 開始進行 Parse HTML
parser.parse(r, callback, true);
} catch (IOException e) {
System.err.printlnEnvelope;
}
    //return null;
  }

// 將 Parse HTML 後的資料印出
public void handleText(char[] text, int position) {

  if (inHeader) {
// 印出 xxxx => <A HREF = ....> xxxx </A>
// xxxx => HTML Tag A 的文字 (text)
     app.txa.append(String.valueOf(text)+"\n");
     // 符合 <A HREF = "xxxx"> 屬性的字串,xxxx 會被印出
       if (name == HTML.Attribute.HREF)
     {          
         app.txa.append(value +"\n");
     }
}
}

// Parse HTML Start Tag
public void handleStartTag(HTML.Tag tag, MutableAttributeSet attributes,int position) {

if (tag == HTML.Tag.A){
     // 以下是針對 Tag 再做額外的處理
     try {
     Enumeration e = attributes.getAttributeNames();
     while(e.hasMoreElements()) {
     name = e.nextElement();
     value = (String)attributes.getAttribute(name);
     // 符合 <A HREF = "xxxx"> 屬性的字串,xxxx 會被印出
     /*if (name == HTML.Attribute.HREF) {
     System.out.println("HREF = "+ value);
     } */
     }
     } catch (Exception e) {
     e.printStackTrace();
    
     }
    }
    // 分析 Tag 的重點在這行
if (tag == HTML.Tag.A.TABLE) {
this.inHeader = true;
}
}

// Parse HTML End Tag
public void handleEndTag(HTML.Tag tag, int position) {
if (tag == HTML.Tag.A.TABLE) {
inHeader = false;
}
}
}

現在問題在於說
我不知道該怎麼只讓他印出
<tr><th><a href=http://XXXXXX> 這xxx這三個包起來的東西
希望各位指教


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





發文: 74
積分: 0
於 2008-03-31 23:21 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搜尋引擎的URL,更改關鍵字可以換網頁
用在擷取<A href=http://OOO.OOO.OOO>XXXXXX</A>的XXX部分
只不過輸出都只出現非中文字,感覺上要輸出中文時,就沒進去if裡
1
2
3
4
5
6
7
8
9
10
11
public void handleText(char[] text, int position) {   
  if (inHeader) {
      try {
        out.write(text); 
        out.flush();
      }
      catch (IOException ex) {
        System.err.println(ex);
      }
    } 
  }


其他大致上跟歐萊禮出版的java網路程式設計第三版
第八章範例8-9 Outliner 一樣


Saive edited on 2008-04-01 21:22
reply to postreply to post
作者 Re:請問 HTMLParser 擷取容器的問題 [Re:Saive]
eLove

若我不在你身邊



發文: 124
積分: 3
於 2008-04-02 14: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
Saive wrote:
用在擷取<A href=http://OOO.OOO.OOO>XXXXXX</A>的XXX部分
只不過輸出都只出現非中文字,感覺上要輸出中文時,就沒進去if裡
1
2
3
4
5
6
7
8
9
10
11
public void handleText(char[] text, int position) {   
  if (inHeader) {
      try {
        out.write(text); 
        out.flush();
      }
      catch (IOException ex) {
        System.err.println(ex);
      }
    } 
  }
handleText() 裡的 if (inHeader) {…} 跟輸出是不是中文沒有關係!
只要 handleStartTag() 與 handleEndTag() 找到 "起始/結尾 HTML.Tag",handleText() 就會利用 inHeader 控制是否輸出 HTML.Tag 中的文字。

其他大致上跟歐萊禮出版的java網路程式設計第三版
第八章範例8-9 Outliner 一樣
8-9 Outliner 範例有偵測網頁編碼,但是有一點問題,不一定適用於任何網頁 ...
一旦偵測的結果不變,將會以預設的「ISO-8859-1」編碼進行網頁分析
輸出應該不會只出現非中文字,而是中文字的部分會因編碼呈現「?」或「」-> 什麼都沒有
Yahoo 搜尋比較特別一點,它一定要加個 header,傳回的 html 才會是含有中文字的 >"<
你可以將回傳的網頁,有加header/沒有header,另存不同檔案再去比較其中差異

以下是修改的 8-9 Outliner 範例:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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;
    private Writer out;
  
    public parseHTML(Writer out) {
      this.out = out;
    }
  
    // 將 Parse HTML 後的資料印出
    public void handleText(char[] text, int position) {
       if (inHeader) {
           // 印出 xxxx => <A HREF = ....> xxxx </A>
           // xxxx => HTML Tag A 的文字 (text)
           try {
             out.write(text);
             out.write(System.getProperty("line.separator"));
             out.flush();
           } catch (IOException e) {
             System.err.println(e);
           }
       }
    }
  
    // Parse HTML Start Tag
    public void handleStartTag(HTML.Tag tag, MutableAttributeSet attributes,int position) {
        // 分析 Tag 的重點在這行
        if (tag == HTML.Tag.A) {
            this.inHeader = true;
        }
    }
  
    // Parse HTML End Tag
    public void handleEndTag(HTML.Tag tag, int position) {
        if (tag == HTML.Tag.A) {
            inHeader = false;
        }
    }
    
    private static void parse(URL url, String encoding) throws IOException {
      ParserGetter kit = new ParserGetter();
      HTMLEditorKit.Parser parser = kit.getParser();
      
      // 讀入網頁 (1)
      //InputStream in = url.openStream();
      
      // 讀入網頁 (2) - Add Header
      HttpURLConnection http = (HttpURLConnection) url.openConnection();
        http.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;");
      InputStream in = http.getInputStream();
      
      // 程式偵測編碼的結果
      System.out.println("程式偵測編碼的結果: " + encoding);
      // Yahoo 搜尋的網頁編碼是 UTF-8
      InputStreamReader r = new InputStreamReader(in, "UTF-8");
      
      HTMLEditorKit.ParserCallback callback = new parseHTML(new OutputStreamWriter(System.out));
      // 呼叫 parse method 開始進行  Parse HTML
      parser.parse(r, callback, true);
    }
  
    public static void main(String[] args) {
  
        ParserGetter kit = new ParserGetter();
        HTMLEditorKit.Parser parser = kit.getParser();
        
        String encoding = "ISO-8859-1";
        URL url = null;
        try {
          // 搜尋 java 關鍵字
          url = new URL("http://tw.search.yahoo.com/search?ei=UTF-8&fr=sfp&p=java&_adv_prop=web&fl=0&vl=0&vf=all&vd=all&iscqry=");
          
          InputStream in = url.openStream();
          InputStreamReader r = new InputStreamReader(in, encoding);
          
          // parse once just to detect the encoding
          HTMLEditorKit.ParserCallback doNothing = new HTMLEditorKit.ParserCallback();
          parser.parse(r, doNothing, false);
          
        } catch (ChangedCharSetException ex) {
          System.out.println("預設的編碼: " + encoding);
          String mimeType = ex.getCharSetSpec();
          System.out.println("例外的編碼: " + mimeType);
          encoding = mimeType.substring(mimeType.indexOf("=") + 1).trim();
          System.out.println("修正的編碼: " + encoding);
        } catch (IOException ex) {
          System.err.println(ex);
        }
        
        try {
          parse(url, encoding);
        } catch(IOException ex) {
          System.err.println(ex);
        }
    }
}


eLove edited on 2008-04-03 05:15
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