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文件的编码类型一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值