Как исправить кодировку в Python Mechanize?
вот пример кода:
from mechanize import Browser br = Browser() page = br.open('http://hunters.tclans.ru/news.php?readmore=2') br.form = br.forms().next() print br.form
Проблема в том, что сервер возвращает неверную кодировку (windows-cp1251). Как я могу вручную установить кодировку текущей страницы в механизации?
Ошибка:
Traceback (most recent call last): File "/tmp/stackoverflow.py", line 5, in <module> br.form = br.forms().next() File "/usr/local/lib/python2.6/dist-packages/mechanize/_mechanize.py", line 426, in forms return self._factory.forms() File "/usr/local/lib/python2.6/dist-packages/mechanize/_html.py", line 559, in forms self._forms_factory.forms()) File "/usr/local/lib/python2.6/dist-packages/mechanize/_html.py", line 225, in forms _urlunparse=_rfc3986.urlunsplit, File "/usr/local/lib/python2.6/dist-packages/ClientForm.py", line 967, in ParseResponseEx _urlunparse=_urlunparse, File "/usr/local/lib/python2.6/dist-packages/ClientForm.py", line 1104, in _ParseFileEx fp.feed(data) File "/usr/local/lib/python2.6/dist-packages/ClientForm.py", line 870, in feed sgmllib.SGMLParser.feed(self, data) File "/usr/lib/python2.6/sgmllib.py", line 104, in feed self.goahead(0) File "/usr/lib/python2.6/sgmllib.py", line 193, in goahead self.handle_entityref(name) File "/usr/local/lib/python2.6/dist-packages/ClientForm.py", line 751, in handle_entityref '&%s;' % name, self._entitydefs, self._encoding)) File "/usr/local/lib/python2.6/dist-packages/ClientForm.py", line 238, in unescape return re.sub(r"&#?[A-Za-z0-9]+?;", replace_entities, data) File "/usr/lib/python2.6/re.py", line 151, in sub return _compile(pattern, 0).sub(repl, string, count) File "/usr/local/lib/python2.6/dist-packages/ClientForm.py", line 230, in replace_entities repl = repl.encode(encoding) LookupError: unknown encoding: windows-cp1251
- Предотвращение ошибок кодирования в Python
- Как изменить кодировку файловой системы через python?
- Кодировать ключи словарей внутри списка от unicode до ascii
- Что лучше всего вернуть результат и распечатать его в конце функции?
- писать специальные символы в таблицу excel пакетом python pyExcelerator / xlwt
Я не знаю о Mechanize, но вы можете взломать codecs
чтобы принимать неправильные имена кодировок, которые имеют как «окна», так и «cp»:
>>> def fixcp(name): ... if name.lower().startswith('windows-cp'): ... try: ... return codecs.lookup(name[:8]+name[10:]) ... except LookupError: ... pass ... return None ... >>> codecs.register(fixcp) >>> '\xcd\xe0\xef\xee\xec\xe8\xed\xe0\xe5\xec'.decode('windows-cp1251') u'Напоминаем'
Исправлено установкой
br._factory.encoding = enc br._factory._forms_factory.encoding = enc br._factory._links_factory._encoding = enc
(обратите внимание на символы подчеркивания) после br.open ()
- Массаж с BeatifulSoup или очистка с помощью Regex
- Debug PyDev + Eclipse – код не перезагружается после изменения кода в режиме останова / приостановки
- Специальные символы Python в строках
- Является ли эта строка Base64? Как я могу узнать, что такое кодировка?
- Установка правильной кодировки при отправке stdout в Python
- Функция Python open («x», «r»), откуда я могу узнать, какой кодировке должен иметь файл?
- Python: предложение о том, как улучшить запись в потоковой текстовый файл в Python
- Ловушки в моем коде для обнаружения кодирования текстового файла с помощью Python?
- Простой способ создания матрицы случайных чисел
- Шаблоны для преобразования объектов Python (кодирование, декодирование, десериализация, сериализация)
- Как предотвратить кодирование аргумента командной строки?