Как отследить исключение ChangedCharSetException в Java при разборе HTML? - PullRequest
1 голос
/ 30 ноября 2011

Я использую следующий код с 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)?

1 Ответ

2 голосов
/ 30 ноября 2011

Самый простой способ, который я нашел, это просто полностью игнорировать кодировку:

Изменение

parserDelegator.parse(inputStreamReader, parserCallback, false);

до:

parserDelegator.parse(inputStreamReader, parserCallback, true);

Так как третий вариант - boolean ignoreCharSet.

...