Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Python проблемы с кодировкой при скачивании html с помощью requests

#html #python #python_3x #кодировка #requests


Пытаюсь спарсить страницу http://mezgil.kz/. Python 3. Получаю кракозябры типо таких:


Код ниже, скрипт сохранен в utf-8. Я не знаю что может быть не так, ведь другие сайты
норм парсятся:

# -*- coding: utf-8 -*-
import requests

result = requests.get('http://mezgil.kz', timeout=30.0)
page = result.text
print(page)

    


Ответы

Ответ 1



import requests result = requests.get('http://mezgil.kz', timeout=30.0) result.encoding='utf-8' page = result.text print(page) Документация - http://docs.python-requests.org/en/master/user/quickstart/

Ответ 2



requests неверно кодировку ответа определил. Для r.text использовалась iso-8859-1 вместо правильной в этом случае utf-8, поэтому кракозябры напечатались. Сервер не указал кодировку в Content-Type http заголовке, поэтому requests выбрал кодировку по умолчанию для http iso-8859-1 (бесполезный и часто вредный выбор, основанный на устаревшей RFC 2616), не пытаясь посмотреть на html-содержимое ответа, в котором прописана другая кодировка . Разработчики объясняют это тем, что requests это http библиотека, а не html библиотека. Правила как именно кодировка должна быть указана (указывать ли в разных местах (как в Content-Type заголовке так и в html документе или только в html документе), что имеет приоритет, BOM, какая кодировка по умолчанию) менялись со временем. Сейчас html5 просто utf-8 требует: "The Encoding standard requires use of the UTF-8 character encoding". См. Require UTF-8. Поэтому можно жёстко прописать: response.encoding = 'utf-8' print(response.text) Если сайт использует какую-то другую кодировку, не указанную в http заголовке, то практичная опция это использование BeautifulSoup класса, специализированного для работы с html и который может поддерживать даже случаи когда документ представлен из смеси кодировок. См. A good way to get the charset/encoding of an HTTP response in Python.

Комментариев нет:

Отправить комментарий