我用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 文档后尝试获取正确的字符?
谢谢
最佳答案
这是网站本身的错误。其实是三个错误:
页面在 HTTP
Content-Type
中没有任何字符集响应头。有ISO-8859-1
在 HTML 元标记中,但是当通过 HTTP 提供页面时,它会被忽略!一般的网络浏览器要么尝试智能检测,要么使用平台默认编码对网页进行编码,在 Windows 机器上为 CP1252。<meta>
标签假装内容是 ISO-8859-1 编码的,但实际字符是–
( U+2013 EN DASH ) 不是 covered通过那个字符集。然而它是covered通过 CP1252 字符集为0x0096
.根据网页源码,产品名称使用直面字符
–
而不是 HTML 实体–
在同一网页的其他地方发现。
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/