java - jsoup 的奇怪编码行为

标签 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

我使用以下代码读取了所需的字符串:

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 Megapixels”中的连字符。像 öäü 这样的普通变音符号可以正确读出。只有这个单个字符,不会输出为“-”造成问题。

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

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

有没有人告诉我如何在使用 jsoup 解析 html 文档后尝试获取正确的字符?

谢谢

最佳答案

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

  1. 页面在 HTTP Content-Type没有任何字符集响应头。有 ISO-8859-1在 HTML 元标记中,但是当通过 HTTP 提供页面时,它会被忽略!一般的网络浏览器要么尝试智能检测,要么使用平台默认编码对网页进行编码,在 Windows 机器上为 CP1252。

  2. <meta>标签假装内容是 ISO-8859-1 编码的,但实际字符是 ( U+2013 EN DASH ) 不是 covered通过那个字符集。然而它是covered通过 CP1252 字符集为 0x0096 .

  3. 根据网页源码,产品名称使用直面字符而不是 HTML 实体 &ndash;在同一网页的其他地方发现。

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

关于java - jsoup 的奇怪编码行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714879/

相关文章:

java - 从带有西里尔字符的 java 打开浏览器( utf 16 ?)

java - ClassNotFoundException : javax. servlet.jsp.JspFactory

java - 获取选定 JTable 单元格的位置?

html - 如何将 Bootstrap 汉堡菜单垂直对齐到导航栏?

javascript - 无法加载脚本 HTML 和 javascript

ruby-on-rails - 在我的 Rails 应用程序中适本地处理非 UTF8 内容

java - 像 HashMap 但排序的东西?

java - 如何在 Java Spring Boot 中使用 RestHighLevelClient 将文档插入 ElasticSearch

java - 当用户摆弄 html 范围 slider 时如何更改内容(文本)?

unicode - 这个字符分隔符是什么:^ _?