Проблема кодировки символов JSoup - PullRequest
21 голосов
/ 09 октября 2011

Я использую JSoup для анализа содержимого с http://www.latijnengrieks.com/vertaling.php?id=5368. это сторонний веб-сайт, в котором не указана правильная кодировка. я использую следующий код для загрузки данных:

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


    }    

}

это дает следующий вывод:

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.

есть ли способ? отметки могут быть исходными (ü) снова в выводе?

Ответы [ 4 ]

47 голосов
/ 10 октября 2011

В заголовке ответа HTTP Content-Type отсутствует атрибут charset. Jsoup будет использовать кодировку платформы по умолчанию при анализе HTML. Document.OutputSettings#charset() не будет работать, поскольку он используется только для представления (на html() и text()), а не для анализа данных (другими словами, уже слишком поздно).

Вам нужно прочитать URL как InputStream и вручную указать кодировку в методе 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());
    }
}

это приводит к

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.
12 голосов
/ 22 октября 2012

Ну, я нашел другой способ сделать это.В моем случае у меня был объект Jsoup Connection, и я хотел получить ответ html из запроса post () на веб-сайте, который был закодирован как «ISO-8859».Поскольку кодировка по умолчанию для JSOUP - UTF-8, содержимое из ответа (html) пришло с заменой некоторых букв на �.Мне нужно было как-то преобразовать его в ISO-8859-15.Для этого я создал соединение

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

. После этого я создал ответный документ, содержащий ответ на сообщение.В связи с тем, что было неясно, как мы можем установить кодировку ответа в Jsoup, я решил выполнить публикацию, а затем сохранить ответ как байты, сохранив свойства кодировки.После этого я создал новую строку, передающую этот байтовый массив и правильную кодировку, которая должна быть применена.После этого документ будет создан с правильной кодировкой.

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

Итак, есть возврат до и после модификации, когда мы используем response.html ()

До:

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

После:

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

5 голосов
/ 09 октября 2011

В документации Jsoup говорится, что Jsoup должен автоматически определять правильную кодировку при чтении в документе, но по какой-то причине это не работает для меня.Затем я попытался вручную установить кодировку документа, используя outputSettings (). Charset (...):

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

Но это все равно не сработало, поэтому, возможно, я делаю это неправильно (япросто изучаю Jsoup).

Одним из обходных путей, который сработал, по крайней мере, для меня, было чтение на веб-странице с помощью сканера, у которого был установлен набор символов:Я буду следить за этой веткой, чтобы узнать, предложит ли кто-нибудь лучшее предложение, которое не требует использования другого класса для чтения в HTML.

0 голосов
/ 08 августа 2016

Я использовал:

public static String charset = "UTF-8";
doc = Jsoup.parse(new URL(theURL).openStream(), charset, theURL);

Также сохранен класс как UTF-8

...