主要分享的内容是对光明网 ISO-8859-1 编码的处理方式。

ISO-8859-1处理案例_python

我在处理响应时发现返回了乱码数据,经过各种encode、decode并不能解决问题,如果强行 ignore 忽略报错会导致数据丢失。

异常网址:​​https://zhonghua.cloud.gmw.cn/service/search.do?​

ISO-8859-1处理案例_python_02

接下来分享一下我的处理方法。


根据经验和分析,此时我选择通过其他方式进行转码查看。

由于JS语言支持面向对象、命令式、声明式、函数式编程范式,并且是目前支持最多编码的语言。

所以我们先把乱码的数据放到JS中尝试解码。

打开一个控制台进行调试:

ISO-8859-1处理案例_处理方法_03

通过escape和unescape可以发现能对这串字符串进行编码。

escape编码之后返回的是urlencode百分号编码。那我们可以再次把这段urlencode编码进行解码。


接下来把相应中的乱码拿出来测试。

如: 2021æ‰‹æœºå ‰æ˜Žç½‘æ–‡ç« é¡µ_å ¨åª’ä½“ç

ISO-8859-1处理案例_爬虫_04

将其escape

ISO-8859-1处理案例_处理方法_05

然后用python进行unquote

ISO-8859-1处理案例_爬虫_06

发现已经成功解码。


所以最终处理方法为:

# -*- coding: utf-8 -*-
# @Author : lx
# @IDE :PyCharm

import requests
import execjs
from urllib import parse

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
}

js = '''
function get_escape(doc){
return escape(doc);
}
'''

url = 'https://m.gmw.cn/2022-01/20/content_1302771636.htm'
doc = requests.get(url, headers=headers).text
doc = execjs.compile(js).call('get_escape', doc)
doc = parse.unquote(doc)
print(doc)