//Parse an HTML file into text while preserving carriage returns
StringBuffer temp = new StringBuffer(html);
final StringBuffer sb = new StringBuffer();//this will be my output
HTMLEditorKit.ParserCallback parserCallback = new
HTMLEditorKit.ParserCallback() {
public boolean readyForNewline;
@Override
public void handleText(final char[] data, final int pos) {
String s = new String(data);
sb.append(s.trim() + " ");
readyForNewline = true;
}
@Override
public void handleStartTag(final HTML.Tag t,
final MutableAttributeSet a,
final int pos) {
if (readyForNewline &&
(t == HTML.Tag.DIV || t == HTML.Tag.BR ||
t == HTML.Tag.P || t == HTML.Tag.TR)) {
sb.append("n");
readyForNewline = false;
}
}
@Override
public void handleSimpleTag(final HTML.Tag t,
final MutableAttributeSet a,
final int pos) {
handleStartTag(t, a, pos);
}
};
try {
new ParserDelegator().parse(new StringReader(temp.toString()),
parserCallback, false);
} catch (IOException e) {
return null;
}
这段代码在小 html 文件上工作正常,但是当我尝试解析已转换为字符串的 ~4MB HTML 文件时,它会抛出 IOException,我不知道为什么?它就在那个尝试循环中,花了我一段时间才找到它,因为控制台没有打印错误。
基本上,此代码旨在获取HTML文件并去除标记,同时保留行距。我在 SO 上找到了这段代码并借用了它,替代解决方案也很好,但从 JSoup 和许多其他解决方案中,这是唯一实现我想要的(无论如何在小文件上)。当文件太大时,此代码会引发 IOException 有什么原因吗?解决这个问题的方法?
谢谢吨!
编辑:这是堆栈
javax.swing.text.ChangedCharSetException
at javax.swing.text.html.parser.DocumentParser.handleEmptyTag(Unknown Source)
at javax.swing.text.html.parser.Parser.startTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseContent(Unknown Source)
at javax.swing.text.html.parser.Parser.parse(Unknown Source)
at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
at org.SmartTable.SmartTable.htmlToText(SmartTable.java:293)
at org.SmartTable.SmartTable.<init>(SmartTable.java:35)
ParserDelegator().parse(new StringReader(temp.toString()), parserCallback, true);
将最后一个"false"更改为 true 以忽略字符集