Форум сайта python.su
0
Доброго времени суток!
Недавно столкнулся с необходимостью написать небольшой парсер одного вебресурса. Использовал urlopen из urllib2 и BeautifulSoup. Кодировка ресурса - utf-8, кодировка локали - тоже utf-8 (debian). Текстовые значения прекрасно обрабатываются, выводятся на экран, но только до того момента, когда их необходимо записать в файл или применить encode/decode.
Значение переменной grpname получаю следующим образом:
res = BeautifulSoup(urlopen(url).read())
grpname = c.contents[0].string
>>>print (grpname, u'Сортовой прокат')
(u'\u0421\u043e\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u043a\u0430\u0442', u'\u0421\u043e\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u043a\u0430\u0442')
>>>print (grpname, u'Сортовой прокат'.encode('utf-8'))
(u'\u0421\u043e\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u043a\u0430\u0442', '\xd0\xa1\xd0\xbe\xd1\x80\xd1\x82\xd0\xbe\xd0\xb2\xd0\xbe\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0\xd1\x82')>>>print (grpname.encode('utf-8'), u'Сортовой прокат'.encode('utf-8')) print (grpname.encode('utf-8'), u'Сортовой прокат'.encode('utf-8'))
Traceback (most recent call last):
File "test.py", line 49, in pctg
print (grpname.encode('utf-8'), u'Сортовой прокат'.encode('utf-8'))
File "/usr/lib/pymodules/python2.6/BeautifulSoup.py", line 430, in encode
return self.decode().encode(encoding)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)Офлайн
0
Ах да, забыл. coding в начале файла тоже указал utf-8 - не помогло никак.
Офлайн
5
grpname.decode('utf-8') тож не помогает говоришь?
Офлайн
0
Да. Соврешенно аналогичная ошибка:
File "test.py", line 53, in pctg
print grpname.decode('utf-8')
File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
import codecs
import sys
streamWriter = codecs.lookup('utf-8')[-1]
sys.stdout = streamWriter(sys.stdout)
print u'INSERT INTO `tovar` (`id`, `num`, `group`, `name`, `gost`, `mark`, `size`) VALUES (%d, %d, %d, "%s", "%s", "%s", "%s");' % (int(id), int(num), int
(grp), name, gost, mark, size)
print u'INSERT INTO `cmetgrps` (`id`, `name`) VALUES (%d, "%s");' % (grp, grpname)
Отредактировано (Фев. 25, 2012 07:30:46)
Офлайн
857
corpseвыведи type(grpname)res = BeautifulSoup(urlopen(url).read())
grpname = c.contents[0].string
Офлайн