Ответ 1
Короткий ответ: используйте page.content
, а не page.text
.
Из http://lxml.de/parsing.html#python-unicode-strings:
синтаксические анализаторы в lxml.etree могут обрабатывать строки unicode сразу... Это требует, однако, чтобы строки unicode не определяли конфликтующую кодировку и, следовательно, лежали относительно их реальной кодировки
Из http://docs.python-requests.org/en/latest/user/quickstart/#response-content:
Запросы будут автоматически декодировать контент с сервера [как
r.text
].... Вы также можете получить доступ к телу ответа как bytes [asr.content
].
Итак, вы видите, что requests.text
и lxml.etree
хотят декодировать utf-8 в unicode. Но если мы допустим requests.text
выполнить декодирование, то утверждение кодировки внутри xml файла становится ложью.
Итак, пусть requests.content
не декодирует. Таким образом lxml
получит последовательно неуказанный файл.