python Requests

the difference between ‘content’ and ‘text’:

content
Content of the response, in bytes.

text
Content of the response, in unicode.

If Response.encoding is None, encoding will be guessed using chardet.The encoding of the response content is determined based solely on HTTP headers.

乱码

问题
requests请求时获取其text,其中中文为乱码,如:全国移动10M-3å
分析
requests会从服务器返回的响应头的 Content-Type 去获取字符集编码,如果content-type有charset字段那么requests才能正确识别编码,否则就使用默认的 ISO-8859-1. 一般那些不规范的页面往往有这样的问题. 打印r.encoding,会得到其编码.

# requests.utils源码
def get_encoding_from_headers(headers):
    """Returns encodings from given HTTP Header Dict.

    :param headers: dictionary to extract encoding from.
    :rtype: str
    """

    content_type = headers.get('content-type')

    if not content_type:
        return None

    content_type, params = cgi.parse_header(content_type)

    if 'charset' in params:
        return params['charset'].strip("'\"")

    if 'text' in content_type:
        return 'ISO-8859-1'

解决
方法一:若知道其编码,则指定它的编码即可。如:

r = requests.post(url=url)
r.encoding = 'utf8'

方法二:获取其原始bytes,再decode你想要的编码

r = requests.post(url=url)
content = r.content
print(content.decode())

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值