如何将HTML转换为文本并保留换行符

6

如何使用NekoHTML或其他足够好的HTML解析器将HTML转换为文本并保留由元素(如br、p、div等)产生的换行符。

示例:
Hello<br/>World
转换后为:

Hello\n  
World  

1
继续前进,就这么做吧!顺便问一下,你的问题是什么? - lexu
我认为这个问题是关于渲染的,因为Neko似乎只是一个解析器。例如,HTML渲染器会将<p>元素进行自动换行,但解析器不会。如果我的猜测正确,那么这篇文章在输出应该如何呈现方面存在不足之处。 - msw
有另一个讨论您问题的帖子,我发现@Mirco Attocchi提出的解决方案非常棒,对我很有效。https://dev59.com/zG035IYBdhLWcg3wE7xr#6031463 - Sabry Shawally
6个回答

8
这是我写的一个函数,通过使用Jsoup迭代节点输出文本(包括换行符)。
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;
}

我已经添加了以下内容以包含链接:if ("a".equals(tagName)){buffer.append(node.attr("href")); buffer.append("\n"); } - Jan Vladimir Mostert

3
w3m -dump -no-cookie input.html > output.txt

2

我在html2txt: THE ASCIINATOR中找到了一个相对聪明的解决方案,它出色地生成类似nroff输出的输出(例如在终端上运行man ls)。它以StackOverflow使用的Markdown样式生成输出。

对于像这个页面这样的中等复杂度的页面,输出结果有些分散,因为它努力将非线性布局转化为线性布局。而对于不那么复杂标记的输出则相当可读


2

如果你不介意硬换行/为等宽字体设计的输出,lynx -dump 可以从HTML生成良好的纯文本。


0

HTML转文本: 我理解这句话的意思是除了换行符之外,所有的HTML格式都将被放弃。

对于这样的任务,我所做的是使用正则表达式来检测任何一组标签封闭。如果标签内的值为br或br/,则插入一个换行符,否则该标签将被丢弃。

它仅适用于简单的HTML页面。表格显然会被线性化。

我一直在考虑如何检测标题标签封闭之间的标题值,以便转换器自动将标题放置在页面顶部。需要再加入一些算法。但我的时间最好花在...

我正在研究使用Google数据API将文档上传到Google文档,然后使用相同的API将其下载/导出为文本。或者,为什么不使用PDF呢?但如果您还没有Google帐户,您必须先注册一个。

Google文档数据下载/导出

Java的Google文档数据API


我不能使用外部服务。应用程序甚至应该可以离线运行。 - Eduardo

-2

你使用什么语言都无所谓吗?你总是可以使用模式匹配。基本上,HTML中的换行标签(br、p、div等)可以用“\n”替换并删除所有其他标签。你总是可以将标签存储在数组中,这样当你遍历HTML文件时就可以轻松检查。然后,任何其他标签和所有其他结束标签(/p等)都可以替换为空字符串,从而获得你想要的结果。


这是一个像NekoHTML这样的HTML解析器所做的事情,但这还不够,因为您需要其他东西,如实体替换。 - Eduardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接