JSoup字符编码问题

我正在使用JSoupparsing来自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标题中缺lesscharset属性。 parsingHTML时,Jsoup将采取平台默认字符集。 Document.OutputSettings#charset()不能用于仅用于表示(在html()text() )上,而不用于parsing数据(换句话说,已经太晚了)。

您需要将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. 

那么,我想出了另一种方式来做到这一点。 在我的情况下,我有一个Jsoup连接对象,我想从一个网站中的“ISO-8859”编码的post()请求中检索html响应。 由于JSOUP的默认编码是UTF-8,所以来自响应(HTML)的内容是用来replace一些字母。 我需要以某种方式将其转换为ISO-8859-15。 为了执行该操作,我创build了连接

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

之后,我创build了一个响应文档,其中包含该post的答案。 由于不清楚我们如何设置Jsoup中响应的编码,所以我select执行后,然后将响应保存为字节,保留编码属性。 之后,我创build了一个传递这个Byte数组的新string和必须应用的正确编码。 之后,文档将以正确的编码创build。

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

所以,在修改之前和之后都有返回,当我们使用response.html()

之前:

62.09-1-00 – Suportet cnico,manuten oeoutrosservi osem tecnologia dainforma o

后:

62.09-1-00 – Suportetécnico,manutençãoe outrosserviçosem tecnologia dainformação

Jsoup文档指出,Jsoup在阅读文档时应该自动检测正确的字符集,但由于某种原因,它不适合我。 然后我尝试使用outputSettings().charset(…)手动设置Document的字符集:

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

但是这仍然不起作用,所以也许我做错了(我只是在学习Jsoup)。

至less对于我来说,一个解决方法的工作就是使用扫描仪读取网页中的字符集:

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

但是我会跟随这个线程来看看是否有人提出了一个更好的build议,不需要使用另一个类来读取HTML。

我用了:

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

此外,保存类为UTF-8