set de caracteres de los valores de los attributes en Jsoup

Uso el Jsoup y necesito recoger los valores de los attributes de todas las tags dentro de un documento html en ascii-encoding manteniéndolos tal como están, sin convertirlos.

Entonces, tengo el siguiente documento html

<!DOCTYPE html> <head> <meta charset="ascii"> </head> <body> <div title="2 &gt; 1, 1 > 0, &agrave; vs &egrave;"> 3 &gt; 2, 1 > 0 </div> </body> 

que quiero analizar mediante Jsoup.

Necesito extraer el valor de title attribite exactamente como es: 2 &gt; 1, 1 > 0, &agrave; vs &egrave; 2 &gt; 1, 1 > 0, &agrave; vs &egrave; .

He creado un Document object de doc como a continuación (está en Kotlin, pero no creo que sea importante aquí):

 val charset = Charset.forName("ascii") val doc = Jsoup.parse(File("test.html").readText(charset)) doc.outputSettings().charset(charset) 

Cuando imprimo el documento por medio de

 println(doc.toString()) 

Recibo la siguiente cadena

 <!doctype html> <html> <head> <meta charset="ascii"> </head> <body> <div title="2 > 1, 1 > 0, &agrave; vs &egrave;"> 3 &gt; 2 </div> </body> </html> 

que difiere del contenido del file por el valor del atributo del title ( &gt; se transforma en > en la cadena "2 > 1" ), mientras que el rest del documento está OK.

Luego, inspeccionando el valor del atributo

  doc.body().select("div").forEach { div -> println("title = ${div.attr("title")}") } 

produce la siguiente cadena

 title = 2 > 1, 1 > 0, à vs è 

Aviso, eso &agrave; y &egrave; transformarse en à y è .

Mi pregunta es: en Jsoup, ¿cómo puedo get valores de atributo de las tags html preservando la forma en que están escritas en el file de input?

En el ejemplo anterior, necesito get la cadena "2 &gt; 1, 1 > 0, &agrave; vs &egrave;" (como está escrito en el file de input) y no "2 > 1, 1 > 0, &agrave; vs &egrave;" niether "2 &gt; 1, 1 &gt; 0, à vs è" .

El método attr() devuelve una cadena sin las entidades HTML y no pude encontrar una manera de mantener las entidades HTML. Sin embargo, puede usar el método Jsoup.clean() para convertir los caracteres de la cadena en entidades.

 val charset = Charset.forName("ascii") val doc = Jsoup.parse(File("test.html").readText(charset)) doc.body().select("div").forEach { div -> val title = Jsoup.clean("${div.attr("title")}", "", Whitelist.none(), Document.OutputSettings().charset(charset)) println("title = $title") } 

El resultado es:

 title = 2 &gt; 1, &agrave; vs &egrave; 

Por supuesto, esta podría no ser una buena solución para su caso de uso.

  • ¿Cómo puedo usar la callback en Kotlin?
  • Por qué ejecutar testings de kotlin tan lento en AndroidStudio 3.0
  • Varios constructores en una class inmutable (datos)
  • No se puede resolver el host pokeAPI
  • Llamar a la function en línea de Kotlin desde Java
  • Kotlin: matriz de generics
  • input duplicada: META-INF / myLibrary.kotlin_module
  • ¿Cómo puedo depurar mi kotlin koan?
  • ¿Cómo implementar finalize () en kotlin?
  • RecyclerView con Kotlin no colocando celdas verticalmente
  • Inicialización de Kotlin 2d Array