日期:2014-05-18  浏览次数:20722 次

关于 htmlparser Parser 的编码问题
我在使用htmlparser来解析HTML,但是使用中发现重新设置编码有问题。

final Parser parser = new Parser("http://forum.csdn.net/");
parser.setEncoding("utf-8");
就是这里的 setEncoding ,应该与Parser解析的页面的编码一致。
由于有的页面是gb2312,有的是utf-8,还有其他的,因此从页面获取编码
但是parser.getEncoding()返回值有问题,因此我自己做了一个resetCharset()方法getEncoding()

  String charset = "gb2312";
  public void resetCharset(final Parser parser) {
  final String CHARSET_STRING = "charset";
  try
  {
  parser.setEncoding(this.charset);
  final NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);
  final NodeList meta = parser.extractAllNodesThatMatch(metaFilter);
  for (int i = 0; i < meta.size(); i++)
  {
  final MetaTag metaTag = (MetaTag) meta.elementAt(i);
  if ((metaTag.getAttribute("http-equiv") != null) && (metaTag.getAttribute("http-equiv").equalsIgnoreCase("content-type")))
  {
  String content = metaTag.getAttribute("content");
  if (null != content)
  {
  int index = content.toLowerCase().indexOf(CHARSET_STRING);

  if (index != -1)
  {
  //下面这一段 org.htmlparser.lexer.page.getCharset()
  content = content.substring(index + CHARSET_STRING.length()).trim();
  if (content.startsWith("="))
  {
  content = content.substring(1).trim();
  index = content.indexOf(";");
  if (index != -1)
  {
  content = content.substring(0, index);
  }
  if (content.startsWith("\"") && content.endsWith("\"") && (1 < content.length()))
  {
  content = content.substring(1, content.length() - 1);
  }

  if (content.startsWith("'") && content.endsWith("'") && (1 < content.length()))
  {
  content = content.substring(1, content.length() - 1);
  }
  }
  this.charset = content;
  }
  }
  }
  }
  }
  catch (final Exception e)
  {
  e.printStackTrace();
  }
  }

这样开始的代码就应该是:
final Parser parser = new Parser("http://forum.csdn.net/");
this.resetCharset(parser);
parser.setEncoding(this.charset); //TestPage.java:Line 102

但这个时候报
org.htmlparser.util.ParserException: reset stream failed
at org.htmlparser.lexer.InputStreamSource.setEncoding(InputStreamSource.java:277)
at org.htmlparser.lexer.Page.setEncoding(Page.java:865)
at org.htmlparser.Parser.setEncoding(Parser.java:478)
at TestPage.test2(TestPage.java:102)
at TestPage.main(TestPage.java:20)