我有以下代码:
public class NewClass {
public String noTags(String str){
return Jsoup.parse(str).text();
}
public static void main(String args[]) {
String strings="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN \">" +
"<HTML> <HEAD> <TITLE></TITLE> <style>body{ font-size: 12px;font-family: verdana, arial, helvetica, sans-serif;}</style> </HEAD> <BODY><p><b>hello world</b></p><p><br><b>yo</b> <a href=\"http://google.com\">googlez</a></p></BODY> </HTML> ";
NewClass text = new NewClass();
System.out.println((text.noTags(strings)));
}
我有结果:
hello world yo googlez
但我想打破界限:
hello world
yo googlez
我看了jsoup's TextNode#getWholeText()但我无法弄清楚如何使用它 .
如果我解析的标记中有 <br>
,我如何在结果输出中获得换行符?
15 回答
保留换行符的真正解决方案应该是这样的:
它满足以下要求:
如果原始html包含换行符(\ n),则会保留它
如果原始html包含br或p标签,则会将它们转换为换行符(\ n) .
同
你有输出
并不是
为此,我正在使用:
我们在这里使用这种方法:
通过传递
Whitelist.none()
,我们确保删除所有HTML .通过传递
new OutputSettings().prettyPrint(false)
,我们确保不重新格式化输出并保留换行符 .使用jsoup尝试这个:
您可以遍历给定元素
并为您的代码
如果html本身不包含“br2n”,则有效
所以,
工作更可靠,更容易 .
这是我将html翻译成文本的版本(实际上是user121196答案的修改版本) .
这不仅可以保留换行符,还可以格式化文本并删除过多的换行符,HTML转义符号,并且您将从HTML中获得更好的结果(在我的情况下,我是通过邮件接收它) .
它最初是用Scala编写的,但您可以轻松地将其更改为Java
对于更复杂的HTML,上述解决方案中没有一个能够正常工作;我能够在保留换行符的同时成功完成转换:
(版本1.10.3)
试试这个:
使用
textNodes()
获取文本节点的列表 . 然后将它们与\n
连接为分隔符 . 这是我使用的一些scala代码,java端口应该很简单:基于其他答案和对这个问题的评论,似乎大多数人来到这里真的在寻找一个通用的解决方案,它将提供HTML文档的格式良好的纯文本表示 . 我知道我是 .
幸运的是,JSoup已经提供了一个非常全面的例子来说明如何实现这个目标:HtmlToPlainText.java
示例
FormattingVisitor
可以很容易地根据您的喜好进行调整,并处理大多数块元素和换行 .为了避免链接腐烂,这里完全是_2595541的解决方案:
使用jsoup尝试这个:
通过调用有问题的html,包含br,以及您希望用作临时换行占位符的任何字符串来使用 . 例如:
递归将确保您用作换行符/换行符占位符的字符串永远不会实际位于源html中,因为它将继续添加“1”,直到html中找不到链接断开器占位符字符串 . 它没有Jsoup.clean方法似乎遇到特殊字符的格式问题 .
基于user121196 's and Green Beret'回答
select
和<pre>
,对我有用的唯一解决方案是:在Jsoup v1.11.2上,我们现在可以使用
Element.wholeText()
.示例代码:
user121196's
answer仍然有效 . 但wholeText()
保留了文本的对齐方式 .