Вопрос по python, unicode – urllib2 читать в Юникоде

46

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

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

import urllib2

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

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

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

Кодирование выполняется с использованием функции из библиотеки urllib, а не из urllib2. Отvoidspace.org.uk/python/articles/urllib2.shtml#headers Macarse
связанные с:A good way to get the charset/encoding of an HTTP response in Python jfs
@Macarse, это не та кодировка, на которую ссылается Виталий, он имеет в виду декодирование и кодирование фактического контекста запроса с помощью «[строка байта]» .decode («[charset]») и «u» [строка юникода] & APOS; .encode (& APOS; UTF-8, & APOS;). Вы ссылаетесь на параметры запроса кодирования. Remco Wendt

Ваш Ответ

2   ответа
97

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

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

Error: User Rate Limit Exceeded Vitaly Babiy
Error: User Rate Limit Exceededpython.org/dev/peps/pep-0263Error: User Rate Limit Exceeded- coding: utf-8 -Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Vitaly Babiy
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded.splitError: User Rate Limit ExceededcharsetError: User Rate Limit Exceeded
9

Content-Type Заголовок http, вы можете использовать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">.

Похожие вопросы