java - studio - jsoup select
Problema de codificación de caracteres JSoup (4)
Bueno, descubrí otra forma de hacer eso. En mi caso, tenía un objeto Jsoup Connection y quería recuperar la respuesta html de una solicitud de publicación () en un sitio web codificado con "ISO-8859". Como la codificación predeterminada para JSOUP es UTF-8, el contenido de la respuesta (el html) venía con reemplazando algunas letras. Necesitaba convertirlo de alguna manera en ISO-8859-15. Para realizar eso, he creado la conexión
Connection connectionTest = Jsoup.connect("URL")
.cookie("cookiereference", "cookievalue")
.method(Method.POST);
Después de eso, he creado un Documento de respuesta que contiene la respuesta de la publicación. Debido al hecho de que no estaba claro cómo podemos establecer la codificación de la respuesta en Jsoup, opté por ejecutar la publicación y luego guardar la respuesta como bytes, conservando las propiedades de codificación. Después de eso, he creado una nueva cadena que pasa esta matriz de bytes y la codificación adecuada que se debe aplicar. Después de eso, el documento se creará con la codificación correcta.
Document response = Jsoup.parse(new String(
connectionTest.execute().bodyAsBytes(),"ISO-8859-15"));
Entonces, está la devolución antes y después de la modificación, cuando usamos response.html ()
Antes de:
62.09-1-00 - Suporte técnico, manutenóo outros servi os em tecnologia da informa o
Después:
62.09-1-00 - Suporte técnico, manutenção e outros serviços em tecnologia da informação
Estoy usando JSoup para analizar el contenido de http://www.latijnengrieks.com/vertaling.php?id=5368 . este es un sitio web de un tercero y no especifica la codificación adecuada. Estoy usando el siguiente código para cargar los datos:
public class Loader {
public static void main(String[] args){
String url = "http://www.latijnengrieks.com/vertaling.php?id=5368";
Document doc;
try {
doc = Jsoup.connect(url).timeout(5000).get();
Element content = doc.select("div.kader").first();
Element contenttableElement = content.getElementsByClass("kopje").first().parent().parent();
String contenttext = content.html();
String tabletext = contenttableElement.html();
contenttext = Jsoup.parse(contenttext).text();
contenttext = contenttext.replace("br2n", "/n");
tabletext = Jsoup.parse(tabletext.replaceAll("(?i)<br[^>]*>", "br2n")).text();
tabletext = tabletext.replace("br2n", "/n");
String text = contenttext.substring(tabletext.length(), contenttext.length());
System.out.println(text);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
esto da el siguiente resultado:
Aeneas dwaalt rond in Troje en zoekt Cre?sa. Cre?sa is echter op de vlucht gestorven Plotseling verschijnt er een schim. Het is de schim van Cre?sa. De schim zegt:''De oorlog woedt!'' Troje is ingenomen! Cre?sa is gestorven:''Vlucht!'' Aeneas vlucht echter niet. Dan spreekt de schim:''Vlucht! Er staat jou een nieuw vaderland en een nieuw koninkrijk te wachten.'' Dan pas gehoorzaamt Aeneas en vlucht.
¿Hay alguna forma de la? las marcas pueden ser originales (ü) en la salida?
El atributo de charset
falta en el encabezado Content-Type
respuesta HTTP. Jsoup recurrirá al juego de caracteres predeterminado de la plataforma al analizar el HTML. Document.OutputSettings#charset()
no funcionará, ya que se usa solo para presentación (en html()
y text()
), no para analizar los datos (en otras palabras, ya es demasiado tarde).
Necesita leer la URL como InputStream
y especificar manualmente el Jsoup#parse()
caracteres en el Jsoup#parse()
.
String url = "http://www.latijnengrieks.com/vertaling.php?id=5368";
Document document = Jsoup.parse(new URL(url).openStream(), "ISO-8859-1", url);
Element paragraph = document.select("div.kader p").first();
for (Node node : paragraph.childNodes()) {
if (node instanceof TextNode) {
System.out.println(((TextNode) node).text().trim());
}
}
esto resulta aquí en
Aeneas dwaalt rond in Troje en zoekt Creüsa.
Creüsa is echter op de vlucht gestorven
Plotseling verschijnt er een schim.
Het is de schim van Creüsa.
De schim zegt:''De oorlog woedt!''
Troje is ingenomen!
Creüsa is gestorven:''Vlucht!''
Aeneas vlucht echter niet.
Dan spreekt de schim:''Vlucht! Er staat jou een nieuw vaderland en een nieuw koninkrijk te wachten.''
Dan pas gehoorzaamt Aeneas en vlucht.
La documentación de Jsoup indica que Jsoup debería detectar automáticamente el juego de caracteres correcto cuando lee en el documento, pero por alguna razón, no funciona para mí. Luego intenté configurar manualmente el juego de caracteres del documento usando outputSettings (). Charset (...):
doc.outputSettings().charset("ISO-8859-1");
Pero eso aún no funcionó, así que tal vez lo estoy haciendo mal (solo estoy aprendiendo Jsoup).
Una solución alternativa que funcionó, al menos para mí, fue leer en la página web utilizando un escáner que tenía su conjunto de caracteres:
String charset = "ISO-8859-1";
URL myUrl = new URL(url);
Scanner urlScanner = new Scanner(myUrl.openStream(), charset);
StringBuilder sb = new StringBuilder();
while (urlScanner.hasNextLine()) {
sb.append(urlScanner.nextLine() + "/n");
}
urlScanner.close();
doc = Jsoup.parse(sb.toString());
Pero seguiré este hilo para ver si alguien ofrece una mejor sugerencia, una que no necesite el uso de otra clase para leer en el HTML.
Solía:
public static String charset = "UTF-8";
doc = Jsoup.parse(new URL(theURL).openStream(), charset, theURL);
Además, guardo la clase como UTF-8