
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
> -------------------------------------------------------------------------- <
作者: qrtt1 (愚人) 看板: java
標題: Re: [工具] HtmlParser 的一些白痴心得
時間: Sat Aug 11 22:51:33 2007
: 不過,有一些網頁,用 HttpURLConnection.getInputStream() 是不行的
: 最殘忍的例子就是 google search result
: http://www.google.com/search?hl=zh-TW&q=htmlparser
要設一下 user-agent
你可以在這挑一個你想用的
http://en.wikipedia.org/wiki/User_agent
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class SimpleUrlConnection {
public static void main(String[] args) throws IOException{
URL u = new URL("http://www.google.com/search?hl=zh-TW&q=htmlparser");
HttpURLConnection urlConnection = (HttpURLConnection) u.openConnection();
urlConnection.addRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; " +
"SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
FileOutputStream out = new FileOutputStream(new File("result.html"));
BufferedInputStream in = new
BufferedInputStream(urlConnection.getInputStream());
int size = 0;
byte[] block = new byte[1024];
while((size = in.read(block)) >0){
out.write(block, 0, size);
}
out.close();
in.close();
}
}
--
有圖有真相, 新版的 eclipse 有 fu
http://farm2.static.flickr.com/1202/1083119916_5c469f95c3_o.png
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.161.122.204
※ 編輯: qrtt1 來自: 218.161.122.204 (08/11 23:01)
