urllib2 читается в Unicode

Мне нужно сохранить содержимое сайта, который может быть на любом языке. И мне нужно иметь возможность искать содержимое для строки Unicode.

Я пробовал что-то вроде:

import urllib2 req = urllib2.urlopen('http://lenta.ru') content = req.read() 

Содержимое представляет собой поток байтов, поэтому я могу найти его для строки Unicode.

Мне нужно каким-то образом, когда я urlopen а затем читаю, чтобы использовать кодировку из заголовков для декодирования содержимого и кодировать его в UTF-8.

  • Как получить URL-адрес перенаправления с помощью Python
  • Python urllib2 Основная проблема с Auth
  • Как сделать метод HTTP DELETE с помощью urllib2?
  • Ошибка - ошибка urlopen _ssl.c: 504: EOF произошел с нарушением протокола, нужна помощь
  • Использование urllib2 через прокси-сервер
  • Почему urllib возвращает мусор из некоторых статей в Википедии?
  • urllib2.HTTPError: ошибка HTTP 401 при запросе с использованием нового Bing API (на лазурном рынке)
  • urllib2 / запросы и относительный путь HTTP
  • 2 Solutions collect form web for “urllib2 читается в Unicode”

    После выполненных операций вы увидите:

     >>> req.headers['content-type'] 'text/html; charset=windows-1251' 

    и так:

     >>> encoding=req.headers['content-type'].split('charset=')[-1] >>> ucontent = unicode(content, encoding) 

    ucontent теперь является строкой Unicode (из 140655 символов) – так, например, чтобы отобразить ее часть, если ваш терминал UTF-8:

     >>> print ucontent[76:110].encode('utf-8') <title>Lenta.ru: Главное: </title> 

    и вы можете искать и т. д. и т. д.

    Редактирование: Unicode I / O обычно сложный (возможно, это то, что держит первоначальный запрос), но я собираюсь обойти сложную проблему ввода строк Unicode в интерактивный интерпретатор Python (полностью не связанный с исходным вопросом), чтобы показать, как , как только строка Юникода правильно введена (я делаю это по кодовым точкам – тупой, но не сложный ;-), поиск абсолютно без проблем (и, следовательно, мы надеемся, что исходный вопрос был тщательно отреагирован). Опять же, предполагая терминал UTF-8:

     >>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435' >>> print x.encode('utf-8') Главное >>> x in ucontent True >>> ucontent.find(x) 93 

    Примечание . Имейте в виду, что этот метод может не работать для всех сайтов, поскольку некоторые сайты только указывают кодировку символов внутри обслуживаемых документов (например, с помощью мета-тегов http-equiv).

    Чтобы разобрать HTTP-заголовок Content-Type , вы можете использовать функцию cgi.parse_header :

     import cgi import urllib2 r = urllib2.urlopen('http://lenta.ru') _, params = cgi.parse_header(r.headers.get('Content-Type', '')) encoding = params.get('charset', 'utf-8') unicode_text = r.read().decode(encoding) 

    Другой способ получить кодировку:

     >>> import urllib2 >>> r = urllib2.urlopen('http://lenta.ru') >>> r.headers.getparam('charset') 'utf-8' 

    Или в Python 3:

     >>> import urllib.request >>> r = urllib.request.urlopen('http://lenta.ru') >>> r.headers.get_content_charset() 'utf-8' 

    Кодирование символов также может быть указано внутри html-документа, например, <meta charset="utf-8"> .

    Python - лучший язык программирования в мире.