同事用Java做了一个抓取任意网页的标题的功能,由于任意网页的HTML的head中meta中指定的charset五花八门,比如常用的utf-8,gbk,gb2312。
自己写代码处理,短时间内,发现各种情况太难考虑周全,总是抓取乱码。面临的挑战:也可能有meta也可能没meta,即使有meta也可能大写也可能小写,即使大小写搞定也可能带空白字符,总之各种意想不到。不过呢,搜索引擎爬虫抓到的网页咋就不会乱码呢?
百度查这个问题基本无解,bing查这个问题也是无用功居多,只好开上蓝灯上谷歌,三个备选方案:
1.上StackOverflow看是否有最佳答案
http://stackoverflow.com/questions/10996726/encoding-of-response-is-incorrect-using-apache-httpclient
Stackoverflow上说如果HTTP client组件不支持,common http也不支持的话,Spring‘s RESTTemplate能干这事。我查了查有点玄。
2.把HTML的元素模型化,提取模型。
http://docs.oracle.com/cd/B28359_01/appdev.111/b28394/adx_j_parser.htm
用Oralce的XML Developer‘s Kit,Example里包含一个操作XML的DOM的AutoDetectEncoding.java类,挺欣喜,可惜下载XDK和这个Example有点费劲。但是后来比较一下XML和HTML的编码元素及方式确实不一样,虽然HTML可以认为是特殊的XML,都是遵循DOM模型,但是DOM不同的Level,水很深,发现也是路选歪了。
3.使用类似搜索殷勤的爬虫程序或组件,还得是java的。
http://www.huqiwen.com/2012/05/03/use-jsoup-analytics-html-document/
这个帖子原作者也说了原来都是htmlparser,后来都鸟枪换炮用jsoup了。炮果然比枪好用。中间还从CSDN找到一个网友的帖子,愿意提供自己在gitbub上开源爬虫,测测网页说是能行,就是会死机,让我怎么用,不能给自己埋雷,宁可不解决。试用jsoup,发现它既是最爱了。