在浏览器里看到"content="text/html; charset=utf-8"
request 获取回来的对象,用.encoding 看到是:ISO-8859-1
看到网上的例子,可能用的环境都是 Python2 的时代,str 还有.decode()方法
似乎没能找到合适的方法。。。
于是自己试着摸了一下,未能完成,
s = requests.get(link, headers=headd)
htmlCode = (s.text).encode("ISO-8859-1")).decode("utf-8")# 失败
发帖请教各位,谢谢!
1
datou 2021-03-05 17:54:56 +08:00 1
第二行的 s.text 改成 s.content
|
2
ysc3839 2021-03-05 17:58:55 +08:00 via Android
或者先修改 r.encoding,再用 r.text 读取。
https://2.python-requests.org/zh_CN/latest/user/quickstart.html#id3 |
3
imn1 2021-03-05 18:06:49 +08:00
从 bytes 类型就是.content 直接使用 decode,不要从 str 类型 encode+decode
如果你要全文,甚至整个 html,再去研究具体编码 如果只是抓取部分,decode 时忽略不兼容字符就行了(error 参数) 不要纠结在无关问题上,忽略的字符恰好在你要抓取的内容之中概率极低 |
4
zhuweiyou 2021-03-05 18:08:13 +08:00
虽然不写 py .
但是这种情况在别的语言里, 一般是先拿到 buffer / bytes 转编码, 而不是先转成 string 再转编码. |
5
wzb0909 2021-03-05 18:19:38 +08:00 via iPhone
|
6
ysc3839 2021-03-05 18:23:35 +08:00 via Android
@imn1 楼主的情况应该是服务器没在 HTTP 头里指定编码,而是在 html 里用 meta charset 指定了。但是 requests 并没有解析 html 的功能,于是使用默认编码 ISO-8859-1 进行解码。
这种情况下,忽略的字符很可能是需要抓取的内容,比如网页使用 UTF-8 编码,主要内容是中文,当作 ISO-8859-1 解码的话,中文部分都是无效的。 |
7
omph 2021-03-05 23:42:15 +08:00
Python3 使用 Requests 抓取网页乱码
https://my.oschina.net/u/1044667/blog/898900 |
8
Kobayashi 2021-03-06 14:23:41 +08:00
Encoding 猜测错误,很正常。
Response.text 其实就是 Response.content decode() 而来。其编码来源:1) Response.encoding 来自于 resp header 。如果前者为空,2) Response.apparent_encoding,利用 chardet.detect 猜测获得。 多半是响应头没有 encoding,然后使用 chardet 猜测错误。chardet 并不是 100% 准确。 解决方案: - 设置正确 Response.encoding 后再读取 Response.text - 或者直接 Response.content.decode(you_encoding) |