关于 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)