如何使用NekoHTML或其他足够好的HTML解析器将HTML转换为文本并保留由元素(如br、p、div等)产生的换行符。
示例:
Hello<br/>World
转换后为:
Hello\n
World
如何使用NekoHTML或其他足够好的HTML解析器将HTML转换为文本并保留由元素(如br、p、div等)产生的换行符。
示例:
Hello<br/>World
转换后为:
Hello\n
World
public static String htmlToText(InputStream html) throws IOException {
Document document = Jsoup.parse(html, null, "");
Element body = document.body();
return buildStringFromNode(body).toString();
}
private static StringBuffer buildStringFromNode(Node node) {
StringBuffer buffer = new StringBuffer();
if (node instanceof TextNode) {
TextNode textNode = (TextNode) node;
buffer.append(textNode.text().trim());
}
for (Node childNode : node.childNodes()) {
buffer.append(buildStringFromNode(childNode));
}
if (node instanceof Element) {
Element element = (Element) node;
String tagName = element.tagName();
if ("p".equals(tagName) || "br".equals(tagName)) {
buffer.append("\n");
}
}
return buffer;
}
w3m -dump -no-cookie input.html > output.txt
我在html2txt: THE ASCIINATOR中找到了一个相对聪明的解决方案,它出色地生成类似nroff输出的输出(例如在终端上运行man ls
)。它以StackOverflow使用的Markdown样式生成输出。
对于像这个页面这样的中等复杂度的页面,输出结果有些分散,因为它努力将非线性布局转化为线性布局。而对于不那么复杂标记的输出则相当可读。
如果你不介意硬换行/为等宽字体设计的输出,lynx -dump
可以从HTML生成良好的纯文本。
HTML转文本: 我理解这句话的意思是除了换行符之外,所有的HTML格式都将被放弃。
对于这样的任务,我所做的是使用正则表达式来检测任何一组标签封闭。如果标签内的值为br或br/,则插入一个换行符,否则该标签将被丢弃。
它仅适用于简单的HTML页面。表格显然会被线性化。
我一直在考虑如何检测标题标签封闭之间的标题值,以便转换器自动将标题放置在页面顶部。需要再加入一些算法。但我的时间最好花在...
我正在研究使用Google数据API将文档上传到Google文档,然后使用相同的API将其下载/导出为文本。或者,为什么不使用PDF呢?但如果您还没有Google帐户,您必须先注册一个。
你使用什么语言都无所谓吗?你总是可以使用模式匹配。基本上,HTML中的换行标签(br、p、div等)可以用“\n”替换并删除所有其他标签。你总是可以将标签存储在数组中,这样当你遍历HTML文件时就可以轻松检查。然后,任何其他标签和所有其他结束标签(/p等)都可以替换为空字符串,从而获得你想要的结果。