Страницы

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

воскресенье, 9 февраля 2020 г.

Кракозябры при записи в файл скаченной html страницы

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


Когда я качаю и сохраняю файл, у меня выводит некие символы типа "\x80\xe2\x94\x80\xe2\x94\x80". 

Как я понял, тут проблема с кодировкой. Как это можно исправить? Заранее спасибо.

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101
Firefox/45.0'
}

url = 'https://ru.dotabuff.com/players/415673590/matches/' 
r = requests.get(url, headers=headers)

with open('test.html', 'w') as output_file:
    output_file.write(str(r.text.encode('UTF8')))

    


Ответы

Ответ 1



\xe2\x94\x80 — это текстовое представление байт в Питоне. Байты - перевод из строки: >>> '\u2500'.encode() b'\xe2\x94\x80' то есть байты: 226, 148, 128 записаны, используя экранирующие последовательности ascii символов \ x h h: \xe2, \x94, \x80 (т.к. 22610 = e216, 14810 = 9416, 12810 = 8016). ─ (U+2500) символ кодируется в utf-8 кодировке последовательностью октетов: 226, 148, 128. Вы их видите как \xe2\x94\x80 из-за str(text.encode()) в коде в вопросе (это ошибка, не следует так делать). Текстовое представление байт (repr) полезно при отладке. На диск следует писать либо сами байты (файл должен быть открыт в двоичном режиме: 'wb') как показано в @gil9red ответе, либо использовать текстовый интерфейс ('w' режим и подходящий для документа encoding параметр). Чтобы гарантировать, что html записан на диск в utf-8 кодировке в самосогласованном виде вне зависимости в какой кодировке сайт возвращает html, можно BeautifulSoup использовать. В вашем случае, сайт уже html в виде utf-8 возвращает и в самом содержимом

Ответ 2



Мне кажется лучшим вариантом сохранить данные без преобразования кодировок. Для этого открываем файл в бинарном режиме и записываем байтовый массив html страницы: with open('test.html', 'wb') as f: f.write(r.content)

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

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