同事用Java作了一個抓取任意網頁的標題的功能,因爲任意網頁的HTML的head中meta中指定的charset五花八門,好比經常使用的utf-8,gbk,gb2312。html
本身寫代碼處理,短期內,發現各類狀況太難考慮周全,老是抓取亂碼。面臨的挑戰:也可能有meta也可能沒meta,即便有meta也可能大寫也可能小寫,即便大小寫搞定也可能帶空白字符,總之各類意想不到。不過呢,搜索引擎爬蟲抓到的網頁咋就不會亂碼呢?java
百度查這個問題基本無解,bing查這個問題也是無用功居多,只好開上藍燈上谷歌,三個備選方案:git
1.上StackOverflow看是否有最佳答案apache
http://stackoverflow.com/questions/10996726/encoding-of-response-is-incorrect-using-apache-httpclientoracle
Stackoverflow上說若是HTTP client組件不支持,common http也不支持的話,Spring's RESTTemplate能幹這事。我查了查有點玄。
app
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,水很深,發現也是路選歪了。code
3.使用相似搜索殷勤的爬蟲程序或組件,還得是java的。htm
http://www.huqiwen.com/2012/05/03/use-jsoup-analytics-html-document/
這個帖子原做者也說了原來都是htmlparser,後來都鳥槍換炮用jsoup了。炮果真比槍好用。中間還從CSDN找到一個網友的帖子,願意提供本身在gitbub上開源爬蟲,測測網頁說是能行,就是會死機,讓我怎麼用,不能給本身埋雷,寧肯不解決。試用jsoup,發現它既是最愛了。