使用jsoup进行奇怪的编码行为

时间:2011-10-10 15:11:47

标签: java html character-encoding html-parsing jsoup

我用jsoup从不同页面的html源代码中提取一些信息。其中大多数是UTF-8编码的。其中一个是用ISO-8859-1编码的,这导致了一个奇怪的错误(在我的选择中)。

包含错误的页面是: http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html

我用以下代码读取了所需的String:

Document doc = Jsoup.connect("http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html").userAgent("Mozilla").get();
String title = doc.getElementsByClass("products_name").first().text();

问题是字符串“HD Armbanduhr aus Metall 4GB Wasserdicht 1280X960 - 5百万像素”中的连字符。像öäü这样的正常变音符号被正确读取。只有这个单一字符,没有输出为“-”提出问题。

我试图用out.outputSettings()。charset(“ISO-8859-1”)覆盖(正确设置)页面编码,但这也无济于事。

接下来,我尝试使用Charset类更改字符串的编码,并手动更改为utf8和iso-8859-1。也没有运气。

在使用jsoup解析html文档后,是否有人提示我可以尝试获取正确的字符?

谢谢

1 个答案:

答案 0 :(得分:7)

这是网站本身的错误。这实际上是三个错误:

  1. 该页面在HTTP Content-Type响应标头中没有任何字符集。 HTML元标记中有ISO-8859-1,但在通过HTTP提供页面时会忽略此项!平均webbrowser将尝试智能检测或使用平台默认编码对网页进行编码,即Windows机器上的CP1252。

  2. <meta>代码假装内容采用ISO-8859-1编码,但实际字符U+2013 EN DASH那个字符集covered。然而,CP1252字符集covered0x0096

  3. 根据网页源代码,产品名称使用文字字符代替HTML实体&ndash;,如同在同一网页上的其他地方所示。

  4. Jsoup可以透明地修复许多开发不当的网页,但这个网页真的超越了Jsoup。您需要手动读取它,然后将其作为CP1252提供给Jsoup。

    String url = "http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html";
    InputStream input = new URL(url).openStream();
    Document doc = Jsoup.parse(input, "CP1252", url);
    String title = doc.select(".products_name").first().text();
    // ...