首页 > 解决方案 > Python请求编码问题

问题描述

我使用 python 请求向这个url发出 get 请求。这是代码片段。

url = 'http://213.139.159.46/prj-wwvauskunft/projects/gus/daten/index.jsp?'
params = {'id': 2619521210}

response = requests.get(
    url,
    params=params
)

print(response.status_code)

text = response.text
content = response.content

我在 Python2.7 和 Python3.6 中运行相同的代码

当我比较两个版本之间的文本变量时,它们是不同的。但是两个版本之间的内容是一样的。我很困惑为什么内容相同但文本不同。如果他们使用相同的编码将文本编码为内容,那么文本不应该相同吗?

我使用chardet来检测内容的编码,两个版本都以ISO-8859-1结尾。他们不使用utf-8的可能原因是什么。这只是一种偏好吗?

另外,当我这样做时:

content.replace('span', '')

在 Python2 中,它可以工作。在 Python3 中,它会抛出这个错误。 TypeError: a bytes-like object is required, not 'str'(使用b'span'b''将解决问题)

但是当我这样做时:

text.replace('span', '')

两个版本都有效。这是为什么?

标签: pythonpython-3.xpython-2.7encodingcharacter-encoding

解决方案


没有保证Python 2Python 3兼容性(既不向后也不向前)。阅读例如Python 2 vs Python 3: Key Differences。例如,如果您的脚本已修改(在末尾添加以下代码段):

print('type(text)   ', type(text))
print('type(content)', type(content))

输出

py -2 D:\Python\SO3\61954902.py
200
('type(text)   ', <type 'unicode'>)
('type(content)', <type 'str'>)
py -3 D:\Python\SO3\61954902.py
200
type(text)    <class 'str'>
type(content) <class 'bytes'>

为了完整起见,脚本如下:

type D:\Python\SO3\61954902.py
import requests
url = 'http://213.139.159.46/prj-wwvauskunft/projects/gus/daten/index.jsp?'
params = {'id': 2619521210}

response = requests.get(
    url,
    params=params
)

print(response.status_code)

text = response.text
content = response.content
print('type(text)   ', type(text))
print('type(content)', type(content))

推荐阅读