请教 request 模块, get url 回来的.text,有非 gbk 码(\xef),无法正常 print...

2021-03-05 17:49:37 +08:00
 uti6770werty

在浏览器里看到"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")# 失败

发帖请教各位,谢谢!

1591 次点击
所在节点    Python
8 条回复
datou
2021-03-05 17:54:56 +08:00
第二行的 s.text 改成 s.content
ysc3839
2021-03-05 17:58:55 +08:00
或者先修改 r.encoding,再用 r.text 读取。
https://2.python-requests.org/zh_CN/latest/user/quickstart.html#id3
imn1
2021-03-05 18:06:49 +08:00
从 bytes 类型就是.content 直接使用 decode,不要从 str 类型 encode+decode

如果你要全文,甚至整个 html,再去研究具体编码
如果只是抓取部分,decode 时忽略不兼容字符就行了(error 参数)
不要纠结在无关问题上,忽略的字符恰好在你要抓取的内容之中概率极低
zhuweiyou
2021-03-05 18:08:13 +08:00
虽然不写 py .

但是这种情况在别的语言里, 一般是先拿到 buffer / bytes 转编码, 而不是先转成 string 再转编码.
wzb0909
2021-03-05 18:19:38 +08:00
@zhuweiyou 虽然已经不写 py 。

但是 requests 这个库集成了各种方便操作,如果经常使用,看一下文档掌握了各种用法会更好。
ysc3839
2021-03-05 18:23:35 +08:00
@imn1 楼主的情况应该是服务器没在 HTTP 头里指定编码,而是在 html 里用 meta charset 指定了。但是 requests 并没有解析 html 的功能,于是使用默认编码 ISO-8859-1 进行解码。
这种情况下,忽略的字符很可能是需要抓取的内容,比如网页使用 UTF-8 编码,主要内容是中文,当作 ISO-8859-1 解码的话,中文部分都是无效的。
omph
2021-03-05 23:42:15 +08:00
Python3 使用 Requests 抓取网页乱码
https://my.oschina.net/u/1044667/blog/898900
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)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/758884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX