Обработка строк Python, Unicode и Beautiful Soup

Я искал решения для ошибки, которая у меня есть, но не нашел/не понял, что будет работать. По сути, если я использую строковые функции (перевод, удаление и т. д.), я получаю ошибки Unicode (кодек ascii не может кодировать символ «x» в позиции y: порядковый номер не в диапазоне (128). Но когда я пытаюсь Beautiful Soup для обработки текста я не получаю ошибок Unicode, но степень сложности (я должен сказать незнакомость) для меня довольно высока Вот выдержки из кода, который у меня есть:

...

import urllib2,sys
import re
import os
import urllib
import string
import time
from BeautifulSoup import BeautifulSoup,NavigableString, SoupStrainer
from string import maketrans
import codecs

trantab=string.maketrans(",",";") 
...

                html5 = urllib2.urlopen(address5).read()
                time.sleep(1.5)

                soup5 = BeautifulSoup(html5)

                for company in iter(soup5.findAll(height="20px")):
                    stream = ""
                    count_detail = 1
                    for tag in iter(company.findAll('td')):
                        if count_detail > 1:
                            stream = stream + string.translate(str(tag.text),trantab)
                            if count_detail < 4 :
                                stream=stream+","
                        count_detail = count_detail + 1
                    print str(storenum)+","+branch_name_address+","+ stream

....

Этот скрипт работает какое-то время, а затем бомбит stream = stream + string.translate(str(tag.text),trantab)

По сути, я просто пытаюсь заменить запятые точкой с запятой в полях, которые я обрабатываю.

Кроме того, пытался удалить встроенные пробелы/пробелы с помощью string.strip, но я получаю аналогичные ошибки.

Как бы я сделал то же самое, используя красивый суп (вплоть до замены запятых точкой с запятой и удаления пробелов)?

Или есть код для решения этих надоедливых ошибок Unicode, если я просто придерживаюсь строковых функций?


person Glenn    schedule 23.02.2011    source источник


Ответы (1)


Вы смешиваете объекты str с объектами unicode, что приводит к тому, что интерпретатор Python вводит один объект в другой. Приведение строк/Unicode требует кодировки, которая по умолчанию считается ascii. Когда это предположение не выполняется, вы получаете такого рода ошибки.

Общее решение состоит в том, чтобы не смешивать str с unicode: используйте юникод везде, где это возможно, и делайте любое преобразование явным с помощью string.encode('utf8', 'strict') и unicode_string.decode('utf8', 'strict') (например, UTF-8).

В этом случае замените

stream = stream + string.translate(str(tag.text),trantab)

с

stream = stream + tag.text.replace(u',', u';')
person jd.    schedule 23.02.2011