[工具] HtmlParser 的一些白痴心得
http://htmlparser.sourceforge.net
最近一直在作處理網頁的東西
抓遠端的網頁,原本是用 HttpURLConnection.getInputStream()
BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getInputStream(), encoding)
);
String tmp;
while( (tmp=bis.readLine()) != null ){
//存檔 or 塞 StringBuffer
}
bis.close();
存檔之後,在用 htmlparser 去 parser 一些想要的東西
例如範例給的,抓 link(<a> 的 href, <link> 等等)
//準備 Parser
Page page = new Page(html, encode);
Lexer lexer = new Lexer(page);
Parser parser = new Parser(lexer);
parser.setEncoding(encode);
//開始處理
ObjectFindingVisitor visitor = new ObjectFindingVisitor(LinkTag.class);
parser.visitAllNodesWith(visitor);
ArrayList<String> tmp = new ArrayList();
for(int i=0; i<visitor.getCount(); i++){
if(((LinkTag)(visitor.getTags()[i])).isHTTPLink()){
tmp.add(((LinkTag)(visitor.getTags()[i])).getLink());
}
}
String[] result = new String[tmp.size()];
tmp.toArray(result);
在大多數情況下,日子也還過得去... [茶]
不過,有一些網頁,用 HttpURLConnection.getInputStream() 是不行的
最殘忍的例子就是 google search result
http://www.google.com/search?hl=zh-TW&q=htmlparser
我先用過 apache 的 HttpClient,發現他是可以的 [暈]
可是,我又不是要處理 post 的網頁,用那個太麻煩 XD
後來看到 HtmlParser 有 Site Capturer 的範例
嗯... 雖然就砍站的效果而言,很糟糕
不過... 抓得下來耶... \囧/
(還沒有去查原因,還請高手順帶指點 \囧/)
翻了一下原始碼,他是這樣子搞的
PrintWriter out = new PrintWriter(new FileOutputStream(file));
for (NodeIterator e = parser.elements(); e.hasMoreNodes();){
out.print(e.nextNode().toHtml());
}
out.close();
嘖嘖,居然來這招... 而且還不用管編碼
(目前還沒 try 出問題就是了)
另外一個... 發現...
就是用 Parser.reset(),就可以重複使用同一個 parser
之前不知道,就... [毆飛]
耍白痴完畢... [逃]
--
侃侃長論鮮窒礙 首頁:http://www.psmonkey.idv.tw
眾目睽睽無心顫 Blog:http://ps-think.blogspot.com
煢居少聊常人事
殺頭容易告白難 歡迎參觀 Java 版(@ptt.cc)精華區 \囧/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.193.251
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 1 之 4 篇):