作者archerlin ()
看板java
标题Re: [工具] HtmlParser 的一些白痴心得
时间Mon Aug 6 15:25:35 2007
纯借标题问一下
※ 引述《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