Re: [工具] HtmlParser 的一些白痴心得
純借標題問一下
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: http://htmlparser.sourceforge.net
[前恕刪...]
: 嘖嘖,居然來這招... 而且還不用管編碼
: (目前還沒 try 出問題就是了)
: 另外一個... 發現...
: 就是用 Parser.reset(),就可以重複使用同一個 parser
: 之前不知道,就... [毆飛]
: 耍白痴完畢... [逃]
之前我也有使用過htmlparser的經驗
但我覺得網頁的編碼始終是個大問題耶
因為世界上的網頁千奇百怪
不按照牌理出牌(不按規範編寫)的html實在不勝枚舉
不成雙成對的tag,沒有任何META宣告的網頁
造成抓取上的判讀和字型解碼相對困難許多
我的應用比較簡單,只是想要抓網頁的標題存成字串
(就是每個網頁在瀏覽器最上方的title標題那行字)
運用他的 TagNameFilter(tagName) 來達到目的,例如:
String tittleName = parseTag(url, "title");
假設tittleName就是我要的標題字串
url就是要抓取的網址,title因為我正是要抓html的"title"這個tag
於是我寫了一個類似下面的method
public static String parseTag(String url, String tagName) {
String ret = "";
Parser parser = new Parser(url);
try {
ret = parser.parse(new TagNameFilter(tagName)).asString();
} catch (ParserException pe) {
pe.printStackTrace();
}
return ret;
}
但我第一次抓取時不管怎麼怎麼寫都會跳出 ParserException
也抓不到我想要的標題字串,後來發現原來是網頁編碼上的問題
經由不斷地反覆的測試和參考了官方網站的FAQ之後
改寫成下面這樣:
public static String parseTag(String url, String tagName) {
String ret = "網頁沒有預設標題";
try {
Parser parser = new Parser(url);
try {
// first todo parser.parse(...);
// maybe throws an EncodingChangeException...
ret = parser.parse(new TagNameFilter(tagName))
.asString();
} catch (EncodingChangeException ece) {
try {
// reset the parser
parser.reset();
// try again with the encoding now in force
// second parser.parse (...);
ret = parser.parse(new TagNameFilter(tagName))
.asString();
} catch (ParserException pe) {
pe.printStackTrace();
}
}
} catch (ParserException pe) {
//catch ParserException if url not found
ret = "此網頁連結已失效";
}
return ret;
}
如上所示,包兩層的try...catch...
透過兩次的second parser才能真正得到我想要的字串回傳
傳回的字串也能有"大約90%"的成功機率不會是亂碼...
為啥還是有10%的失敗率呢?後來我分析原因
發現失敗的網站大多沒有寫這行(或有寫但編碼寫錯了)
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
估計他抓不到 charset 這個屬性所以就無法判讀出該網頁到底是啥編碼了
導致我要手動的再去做轉碼的動作
例如在
String tittleName = parseTag(url, "title");
之後,在META無指定charset的中文網頁需多做這行
tittleName = new String(tittleName.getBytes("ISO-8859-1"),"BIG5");
在META無指定charset的日文網頁需多執行這行...依此類推
tittleName = new String(tittleName.getBytes("ISO-8859-1"),"Shift-JIS");
不知道版上的高手有無啥解決方案,能夠準確的判定該網頁的編碼阿?
至於一些框架頁面,多重轉址頁面,一些稀奇古怪的網頁,抓不到就算了 XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.63.50.189
討論串 (同標題文章)