Может показаться, что строки, возвращаемые из readlines
, не являются строками Unicode, а являются байтовыми строками (т.е. экземплярами str
, содержащими потенциально не-ASCII-символы).Эти байты являются необработанными данными, полученными в теле ответа HTTP, и будут представлять разные строки в зависимости от используемой кодировки.Их необходимо «декодировать», прежде чем их можно будет обрабатывать как текст (байты! = Символы).
Если кодировка UTF-8, этот код должен работать правильно:
f = urllib2.open('http://www.google.com')
website = Website()
website.content = db.Text(f.read(), encoding = 'utf-8-sig') # 'sig' deals with BOM if present
Обратите внимание, что фактическая кодировка варьируется от сайта к сайту (иногда даже от страницы к странице).Используемая кодировка должна быть включена в заголовок Content-Type в HTTP-ответе (см. этот вопрос , чтобы узнать, как ее получить), но если это не так, она может быть включена в метатег в заголовкеHTML (в этом случае правильное извлечение намного сложнее):
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Обратите внимание, что существуют сайты, которые не указывают кодировку или указывают неправильную кодировку.
Если вы действительноне заботятся о каких-либо символах, кроме ASCII, вы можете игнорировать их и покончить с этим:
f = urllib2.open('http://www.google.com')
website = Website()
content = unicode(f.read(), errors = 'ignore') # Ignore characters that cause errors
website.content = db.Text(content) # Don't need to specify an encoding since content is already a unicode string