Tengo el siguiente 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)));
}
Y tengo el resultado:
hello world yo googlez
Pero quiero romper la línea:
hello world
yo googlez
He mirado el TextNode # getWholeText () de jsoup pero no puedo averiguar cómo usarlo.
Si hay un <br>
marcado en el marcado que analizo, ¿cómo puedo obtener un salto de línea en mi salida resultante?
Respuestas:
La solución real que conserva los saltos de línea debería ser así:
Cumple los siguientes requisitos:
fuente
for (Element e : document.select("br")) e.after(new TextNode("\n", ""));
agregar una nueva línea real y no la secuencia \ n? Consulte Node :: after () y Elements :: append () para conocer la diferencia. EnreplaceAll()
este caso, no es necesario. Similar para py otros elementos de bloque.Estamos usando este método aquí:
Al pasarlo,
Whitelist.none()
nos aseguramos de que se elimine todo el HTML.Al pasar
new OutputSettings().prettyPrint(false)
nos aseguramos de que la salida no se reformatee y se conserven los saltos de línea.fuente
br
etiquetas producen nuevas líneas. ¿Qué pasa con cualquier otro elemento de bloque en HTML comodiv
,p
,ul
etc.? Todos ellos también introducen nuevas líneas.Con
tienes salida
y no
Para esto estoy usando:
fuente
<br>
elementos con nodos de texto que contienen nuevas líneas y luego llamar en.text()
lugar de hacer una transformación de expresiones regulares que causará una salida incorrecta para algunas cadenas como<div title=<br>'not an attribute'></div>
Pruebe esto usando jsoup:
fuente
new Document.OutputSettings().prettyPrint(true)
En Jsoup v1.11.2, ahora podemos usar
Element.wholeText()
.Código de ejemplo:
user121196's
la respuesta todavía funciona. PerowholeText()
conserva la alineación de los textos.fuente
Para HTML más complejo, ninguna de las soluciones anteriores funcionó del todo bien; Pude hacer la conversión con éxito mientras conservaba los saltos de línea con:
(versión 1.10.3)
fuente
Puedes atravesar un elemento dado
Y por tu codigo
fuente
isBlock
en sutail(node, depth)
lugar y agregarlo\n
al salir del bloque en lugar de al ingresarlo. Estoy haciendo eso (es decir, usandotail
) y funciona bien. Sin embargo, si usohead
como tú, entonces esto:<p>line one<p>line two
termina como una sola línea.funciona si el propio html no contiene "br2n"
Entonces,
funciona de forma más fiable y sencilla.
fuente
Pruebe esto usando jsoup:
fuente
Úselo
textNodes()
para obtener una lista de los nodos de texto. Luego concatenarlos con\n
como separador. Aquí hay un código scala que utilizo para esto, el puerto java debería ser fácil:fuente
Según las otras respuestas y los comentarios sobre esta pregunta, parece que la mayoría de las personas que vienen aquí están realmente buscando una solución general que proporcione una representación de texto sin formato con un formato agradable de un documento HTML. Sé que lo estaba.
Afortunadamente, JSoup ya proporciona un ejemplo bastante completo de cómo lograr esto: HtmlToPlainText.java
El ejemplo
FormattingVisitor
se puede modificar fácilmente según sus preferencias y se ocupa de la mayoría de los elementos de bloque y del ajuste de línea.Para evitar la descomposición del enlace, aquí está la solución de Jonathan Hedley completa:
fuente
Esta es mi versión de traducir html a texto (la versión modificada de la respuesta de user121196, en realidad).
Esto no solo conserva los saltos de línea, sino que también formatea el texto y elimina los saltos de línea excesivos, los símbolos de escape HTML, y obtendrá un resultado mucho mejor de su HTML (en mi caso, lo recibo por correo).
Está escrito originalmente en Scala, pero puede cambiarlo a Java fácilmente
fuente
Prueba esto:
fuente
Se usa al llamar con el html en cuestión, que contiene el br, junto con cualquier cadena que desee usar como marcador de posición de nueva línea temporal. Por ejemplo:
La recursividad asegurará que la cadena que utiliza como marcador de posición de salto de línea / salto de línea nunca estará realmente en el html de origen, ya que seguirá agregando un "1" hasta que no se encuentre la cadena de marcador de posición del separador de enlaces en el html. No tendrá el problema de formato que los métodos Jsoup.clean parecen encontrar con caracteres especiales.
fuente
Según la respuesta de user121196 y Green Beret con
select
s y<pre>
s, la única solución que me funciona es:fuente