日期:2014-05-17  浏览次数:20718 次

htmlparser解析html时的编码问题

htmlparser是个解析html文件的一个很不错的库。它能够过滤几乎所有的html元素,而只提供给我们纯文本。但是要用它来解析html,需要好好的搞一个搞编码问题。

htmlparser的默认编码类型是iso,所以我们要根据文件内容的不同来手动设置一个所需要的编码。

?

Parser myParser = new Parser(file.getAbsolutePath());
myParser.setEncoding("unicode");

通常html里都会有这样一句话<meta http-equiv='Content-Type' content='text/html;charset= gbk' />

用来表示该html的编码类型是什么,但当我们用普通方法来解析这个文件时

 public void get(String path){
        File f = new File(path);
        try {
            InputStreamReader isr = new FileReader(f);
            System.out.println(isr.getEncoding());
            char[] c = new char[128];
            while(isr.read(c)>0){
                String str = String.valueOf(c);
               // System.out.println(new String(str.getBytes(),"utf-8"));
            }
            InputStream is = new FileInputStream(f);
            byte[] b = new byte[1024];
            while(is.read(b)>0){
                //String.
                String str = new String(b,"unicode");
                System.out.println(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
}

?这句话没有意义,无论这句话所申明的编码类型是什么,我们要想解析这个文件,仍然只能用这个文件的编码类型来解析。

但当我们用到htmlparser时,这句话就有意义了。

Parser myParser;
        try {
            myParser = new Parser(path);
            System.out.println(myParser.getEncoding());
            myParser.setEncoding("unicode");
            HtmlPage htmlpage = new HtmlPage(myParser);
            System.out.println(myParser.getEncoding());
            myParser.visitAllNodesWith(htmlpage);
            // 通过htmlparser 获取body内容
            String body = htmlpage.getBody().toHtml();
            System.out.println(body);

        } catch (ParserException e) {
            e.printStackTrace();
        }

? 这个代码运行时会报一个错org.htmlparser.util.EncodingChangeException: character mismatch (new: ? [0xfe] != old: ?[0x20 ]) for encoding change from unicode to gbk at character offset 0

也就是说,htmlparser在解析html时,既要用到文件的编码,也要用到<meta http-equiv='Content-Type' content='text/html;charset= gbk' />这句中的编码类型,而且它们必须一致。

当然,如果把<meta http-equiv='Content-Type' content='text/html;charset= gbk' />这句删掉,那就没有任何问题了,但为了规范化

我们仍要加上这句,并强制这句中所写的编码类型和该html文件的编码类型一致。