Eu tenho o seguinte código:
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)));
}
E eu tenho o resultado:
hello world yo googlez
Mas eu quero quebrar a linha:
hello world
yo googlez
Eu olhei para o TextNode # getWholeText () do jsoup, mas não consigo descobrir como usá-lo.
Se houver um <br>
na marcação que analiso, como posso obter uma quebra de linha na saída resultante?
Respostas:
A solução real que preserva as quebras de linha deve ser assim:
Ele atende aos seguintes requisitos:
fonte
for (Element e : document.select("br")) e.after(new TextNode("\n", ""));
acrescentar nova linha real e não a sequência \ n? Veja Node :: after () e Elements :: append () para a diferença. OreplaceAll()
não é necessário neste caso. Semelhante para pe outros elementos de bloco.Estamos usando este método aqui:
Ao passá-lo
Whitelist.none()
, garantimos que todo o HTML foi removido.Ao passar
new OutputSettings().prettyPrint(false)
, certificamo-nos de que a saída não é reformatada e que as quebras de linha são preservadas.fonte
br
tags produzem novas linhas. O que sobre qualquer outro elemento de bloco em HTML, comodiv
,p
,ul
etc? Todos eles apresentam novas linhas também.Com
você tem saída
e não
Para isso estou usando:
fonte
<br>
elementos por nós de texto contendo novas linhas e depois chamar em.text()
vez de fazer uma transformação regex que causará saída incorreta para algumas strings como<div title=<br>'not an attribute'></div>
Tente fazer isso usando jsoup:
fonte
new Document.OutputSettings().prettyPrint(true)
No Jsoup v1.11.2, agora podemos usar
Element.wholeText()
.Código de exemplo:
user121196's
a resposta ainda funciona. MaswholeText()
preserva o alinhamento dos textos.fonte
Para HTML mais complexo, nenhuma das soluções acima funcionou perfeitamente; Consegui fazer a conversão com sucesso, preservando as quebras de linha com:
(versão 1.10.3)
fonte
Você pode percorrer um determinado elemento
E para o seu código
fonte
isBlock
emtail(node, depth)
vez disso, e acrescentar\n
ao sair do bloco em vez de ao entrar. Estou fazendo isso (ou seja, usandotail
) e funciona bem. No entanto, se eu usarhead
como você, então isso:<p>line one<p>line two
acaba como uma única linha.funciona se o próprio html não contiver "br2n"
Assim,
funciona de forma mais confiável e fácil.
fonte
Tente fazer isso usando jsoup:
fonte
Use
textNodes()
para obter uma lista dos nós de texto. Em seguida, concatene-os com um\n
separador. Aqui estão alguns códigos de scala que uso para isso, a porta java deve ser fácil:fonte
Com base nas outras respostas e nos comentários sobre esta questão, parece que a maioria das pessoas que vêm aqui estão realmente procurando por uma solução geral que fornecerá uma representação de texto simples bem formatada de um documento HTML. Eu sei que estava.
Felizmente, o JSoup já fornece um exemplo bastante abrangente de como fazer isso: HtmlToPlainText.java
O exemplo
FormattingVisitor
pode ser facilmente ajustado de acordo com sua preferência e lida com a maioria dos elementos de bloco e quebra de linha.Para evitar o apodrecimento do link, aqui está a solução completa de Jonathan Hedley :
fonte
Esta é a minha versão de tradução de html para texto (a versão modificada da resposta user121196, na verdade).
Isso não apenas preserva as quebras de linha, mas também formata o texto e remove quebras de linha excessivas, símbolos de escape HTML, e você obterá um resultado muito melhor do seu HTML (no meu caso, estou recebendo por e-mail).
Ele foi originalmente escrito em Scala, mas você pode alterá-lo para Java facilmente
fonte
Experimente isto:
fonte
Usado chamando com o html em questão, contendo o br, junto com qualquer string que você deseja usar como marcador temporário de nova linha. Por exemplo:
A recursão garantirá que a string que você usa como placeholder de nova linha / linebreaker nunca estará realmente no html de origem, pois continuará adicionando um "1" até que a string de placeholder do linkbreaker não seja encontrada no html. Não haverá o problema de formatação que os métodos Jsoup.clean parecem encontrar com caracteres especiais.
fonte
Baseado em user121196 de e resposta da boina verde com as
select
s e<pre>
s, a única solução que funciona para mim é:fonte