我将以下代码与 javax.swing.text.html.parser.ParserDelegator
结合使用,以便解析来自网站的超链接。
InputStream inputStream;
InputStreamReader inputStreamReader;
inputStream = rsc.getUrl().openStream();
inputStreamReader = new InputStreamReader(inputStream);
ParserDelegator parserDelegator = new ParserDelegator();
ParserCallback parserCallback = new ParserCallback() {
public void handleStartTag(Tag tag, MutableAttributeSet attribute, int pos) {
if (tag == Tag.A) {
String address = (String) attribute.getAttribute(Attribute.HREF);
if ((address != null) && !address.equalsIgnoreCase("null"))
links.add(address);
}
}
public void handleSimpleTag(Tag t, MutableAttributeSet a, final int pos) { }
public void handleEndTag(Tag t, final int pos) { }
public void handleComment(final char[] data, final int pos) { }
public void handleText(final char[] data, final int pos) { }
public void handleError(final java.lang.String errMsg, final int pos) { }
};
parserDelegator.parse(inputStreamReader, parserCallback, false);
这对于大多数网站来说效果很好,但例如,当我尝试打开 http://www.univie.ac.at
时,我收到以下异常:
javax.swing.text.ChangedCharSetException
at javax.swing.text.html.parser.DocumentParser.handleEmptyTag(DocumentParser.java:172)
at javax.swing.text.html.parser.Parser.startTag(Parser.java:413)
at javax.swing.text.html.parser.Parser.parseTag(Parser.java:1943)
at javax.swing.text.html.parser.Parser.parseContent(Parser.java:2061)
at javax.swing.text.html.parser.Parser.parse(Parser.java:2228)
at javax.swing.text.html.parser.DocumentParser.parse(DocumentParser.java:105)
at javax.swing.text.html.parser.ParserDelegator.parse(ParserDelegator.java:84)
我将如何捕获此异常,但仍继续解析我的远程文档(例如我的 InputStream
)?
最佳答案
我发现的最简单的方法就是完全忽略字符集:
改变
parserDelegator.parse(inputStreamReader, parserCallback, false);
至:
parserDelegator.parse(inputStreamReader, parserCallback, true);
因为第三个选项是booleanignoreCharSet
。
关于java - 解析 HTML 时如何在 Java 中跟踪 ChangedCharSetException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8317352/