web-dev-qa-db-fra.com

Problème d'encodage de caractères JSoup

J'utilise JSoup pour analyser le contenu de http://www.latijnengrieks.com/vertaling.php?id=5368 . il s'agit d'un site Web tiers et ne spécifie pas un encodage approprié. j'utilise le code suivant pour charger les données:

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();
        }


    }    

}

cela donne la sortie suivante:

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.

y a-t-il un moyen pour le? marques peuvent être à nouveau l'original (ü) dans la sortie?

23
Hihaatje

L'attribut charset est manquant dans l'en-tête de réponse HTTP Content-Type. Jsoup aura recours au jeu de caractères par défaut de la plate-forme lors de l'analyse du code HTML. La Document.OutputSettings#charset() ne fonctionnera pas car elle est utilisée uniquement pour la présentation (sur html() et text()), pas pour analyser les données (en d'autres termes, il est trop tard déjà).

Vous devez lire l'URL en tant que InputStream et spécifier manuellement le jeu de caractères dans la méthode 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());
    }
}

cela se traduit ici 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.
49
BalusC

Eh bien, j'ai trouvé une autre façon de le faire. Dans mon cas, j'avais un objet Jsoup Connection et je voulais récupérer la réponse html d'une demande post () dans un site Web qui était codé avec "ISO-8859". Comme l'encodage par défaut pour JSOUP est UTF-8, le contenu de la réponse (le html) venait avec le remplacement de certaines lettres. Je devais en quelque sorte le convertir en ISO-8859-15. Pour cela, j'ai créé la connexion

Connection connectionTest = Jsoup.connect("URL")
.cookie("cookiereference", "cookievalue")
.method(Method.POST);

Après cela, j'ai créé un document de réponse qui contient la réponse du message. Étant donné qu'il n'était pas clair comment définir l'encodage de la réponse dans Jsoup, j'ai choisi d'exécuter la publication, puis d'enregistrer la réponse sous forme d'octets, en préservant les propriétés d'encodage. Après cela, j'ai créé une nouvelle chaîne en passant ce tableau d'octets et l'encodage approprié qui doit être appliqué. Après cela, le document sera créé avec l'encodage correct.

Document response = Jsoup.parse(new String(
connectionTest.execute().bodyAsBytes(),"ISO-8859-15"));

Donc, il y a le retour avant et après la modification, quand on utilise response.html ()

Avant:

62.09-1-00 - Suporte t�cnico, manuten��o e outros serv�os em tecnologia da informa��o

Après:

62.09-1-00 - Suporte técnico, manutenção e outros serviços em tecnologia da informação

14
hugoeiji

La documentation de Jsoup indique que Jsoup devrait détecter automatiquement le jeu de caractères correct lors de la lecture du document, mais pour une raison quelconque, cela ne fonctionne pas pour moi. J'ai ensuite essayé de définir manuellement le jeu de caractères du document à l'aide de outputSettings (). Charset (...):

doc.outputSettings().charset("ISO-8859-1");

Mais cela n'a toujours pas fonctionné, alors peut-être que je me trompe (j'apprends juste Jsoup).

Une solution de contournement qui a fonctionné, du moins pour moi, était de lire la page Web à l'aide d'un scanner dont le jeu de caractères était défini:

     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());

Mais je suivrai ce fil pour voir si quelqu'un propose une meilleure suggestion, qui n'a pas besoin d'utiliser une autre classe pour lire dans le HTML.