V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
uti6770werty
V2EX  ›  Python

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

  •  
  •   uti6770werty · 2021-03-05 17:49:37 +08:00 · 1574 次点击
    这是一个创建于 1119 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    发帖请教各位,谢谢!

    8 条回复    2021-03-06 14:23:41 +08:00
    datou
        1
    datou  
       2021-03-05 17:54:56 +08:00   ❤️ 1
    第二行的 s.text 改成 s.content
    ysc3839
        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
    imn1
        3
    imn1  
       2021-03-05 18:06:49 +08:00
    从 bytes 类型就是.content 直接使用 decode,不要从 str 类型 encode+decode

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

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

    但是 requests 这个库集成了各种方便操作,如果经常使用,看一下文档掌握了各种用法会更好。
    ysc3839
        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 解码的话,中文部分都是无效的。
    omph
        7
    omph  
       2021-03-05 23:42:15 +08:00
    Python3 使用 Requests 抓取网页乱码
    https://my.oschina.net/u/1044667/blog/898900
    Kobayashi
        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)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1904 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:25 · PVG 00:25 · LAX 09:25 · JFK 12:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.