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