java - JSoup字符编码问题

标签 java jsoup

我正在使用 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.

有什么办法吗?标记可以在输出中再次变为原来的 (ü) 吗?

最佳答案

HTTP 响应 Content-Type header 中缺少 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.

关于java - JSoup字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24300059/

相关文章:

java - Jsoup getElementsByTag 或选择?

java - 从 JSOUP 解析的 HTML 中删除转义文本

java - volatile 变量的工作

java - IntelliJ无法识别camelCase吗?

java - 初始化 HashMap 的最佳方式

java - 使用 jsoup 提取 html 代码 - 两个彼此相邻的 span 标签

java - 使用 jsoup 从 url 中提取适当的内容

Java代码优化(jsoup)

java - 单击按钮时 JTable 单元格发生变化?

java - 如何使用 org.apache.commons.codec.binary.base64 对 Java 对象进行 Base64 编码?