当前位置: 首页 > 面试题库 >

jsoup的奇怪编码行为

萧韬
2023-03-14
问题内容

我使用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
Megapixels”中的连字符。像öäü这样的正常变音符号可以正确读取。仅此单个字符,不会输出为“-” 造成了问题。

我试图用out.outputSettings()。charset(“ ISO-8859-1”)覆盖(正确设置的)页面编码,但是那也没有帮助。

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

有没有人提示我用jsoup解析html文档后可以尝试获得正确的字符?

谢谢


问题答案:

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

  1. 该页面在HTTP 响应标头中 不带 任何字符集的 情况下提供Content-Type。有ISO-8859-1在HTML meta标签,但在页面都通过HTTP这个被忽略!一般的网络浏览器将尝试智能检测或使用平台默认编码对网页进行编码,该网页在Windows计算机上为CP1252。

  2. <meta>标签假装内容编码ISO-8859-1,但实际的字符(U + 2013 EN DASH)是 不能 覆盖由字符集的。但是,CP1252字符集将其覆盖为0x0096

  3. 根据网页源代码,产品名称使用原义字符而不是HTML实体&ndash;,而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();
// ...


 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 我在登录测试方法中面临奇怪的执行行为。我在selenium网格下运行这段代码。网格配置为独立服务器。因此,首先,我使用批处理文件启动selenium网格(Hub\Node)以通过测试执行。 代码:1. pojDataSource.java: clsConstant。java: 模块测试。java: 当我在Eclipse IDE中以调试模式执行代码时,它向我显示了奇怪的行为。首先,它启动浏览器并打开

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况