使用Hapi、axios、cheerio爬取ISO-8859-1站点时JSON输出编码错误如何解决
问题根因
你当前的乱码核心是axios默认会自动将响应体按UTF-8编码转为字符串,此时原始二进制数据已经被错误转码,后续再做ISO-8859-1转换也无法恢复原始正确内容。
可行解决方案
步骤1:配置axios返回原始二进制缓冲
调用axios.get时添加responseType: 'arraybuffer'参数,强制返回原始Buffer,避免axios自动按UTF-8转码:
const response = await axios.get(url2Get, { responseType: 'arraybuffer' });
步骤2:使用iconv-lite正确解码
直接对返回的原始Buffer做解码,不需要先转字符串再转Buffer:
const iconv = require('iconv-lite'); // 若解码后还有小概率乱码,可以尝试把'ISO-8859-1'替换为'win1252',很多老站点实际用的是Windows-1252编码 const html = iconv.decode(response.data, 'ISO-8859-1');
步骤3:加载到cheerio处理
const $ = cheerio.load(html, { decodeEntities: false }); // 后续正常提取节点内容即可,比如$('.name').text()拿到的就是正常的"DÓLAR BNA"
补充验证点
如果按上述操作仍有乱码,可先打印解码后的html字符串,确认解码环节是否正常:如果html里的文字已经正确,那就是后续Hapi返回响应时的编码问题,需要给Hapi的响应头设置content-type: application/json; charset=utf-8,确保返回JSON时编码正确。
内容的提问来源于stack exchange,提问作者Enrique
相关产品推荐
相关产品推荐

