Почему запросы знают формат кодировки символов содержимого? - PullRequest
1 голос
/ 26 октября 2019

Как requests visible_encoding не может правильно кодировать содержимое символа?

У меня есть фрагмент кода ниже, который может выразить мой вопрос:

import requests

url = "https://item.jd.com/100000177760.html"

r = requests.get(url)

print(r.status_code, r.encoding)  # 200, gbk

print(r.apparent_encoding)  # GB2312

почему запросы могут знать формат кодировки символов содержимого?

Ответы [ 3 ]

0 голосов
/ 26 октября 2019

Библиотека requests может использовать заголовки HTTP, установленные в ответе, для определения кодировки ответа.

В вашем примере:

url = "https://item.jd.com/100000177760.html"
r = requests.get(url)
print(r.headers)

с результатом:

{
    "Date": "Sat, 26 Oct 2019 05:24:58 GMT",
    "Content-Type": "text/html; charset=gbk",
    "Content-Length": "42964",
    "Connection": "keep-alive",
    #...
}

Где вы можете увидеть charset=gbk в заголовке Content-Type.

0 голосов
/ 27 октября 2019

Запрашивает извлекает кодировку из заголовка Content-Type ответа. Если в заголовке кодировка не найдена, то свойство apparent_encoding ответа оценивается и используется как значение r.encoding.

apparent_encoding определяется с помощью chardet библиотека для угадывания кодировки тела ответа.

В случае URL-адреса в вопросе кодировка объявляется в заголовке Content-Type

>>> r.headers['Content-Type']
'text/html; charset=gbk'

, поэтомуr.apparent_encoding не оценивается до тех пор, пока к нему не будет получен явный доступ путем выполнения print(r.apparent_encoding).

В этом конкретном случае, кажется, chardet ошибается: текстовый атрибут ответа может быть закодирован с помощью кодека gbk, но не с помощьюGB2312.

0 голосов
/ 26 октября 2019

Python requests используйте chardet lib, чтобы проверить текст, выглядит ли он как кодировка.

Вы можете найти больше в документе chardet .

...