urllib2 читать в Юникоде - PullRequest
46 голосов
/ 20 июня 2009

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

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

import urllib2

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

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

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

Ответы [ 2 ]

98 голосов
/ 20 июня 2009

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

>>> 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>

и вы можете искать, и т. Д., И т. Д.

Edit: ввод / вывод Unicode, как правило, сложно (это может быть то, что задерживает оригинальный asker), но я собираюсь обойти трудную проблему ввода строк 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-эквивалент).

9 голосов
/ 21 декабря 2013

Для разбора Content-Type http заголовка вы можете использовать cgi.parse_header function:

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">.

...