Обработка строк Python, Unicode и Beautiful Soup - PullRequest
2 голосов
/ 23 февраля 2011

Я искал решения для ошибки, которую у меня есть, но я не нашел / не понял ту, которая будет работать. По сути, если я использую строковые функции (перевод, раздевание и т. Д.), Я получаю ошибки 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, но я получаю похожие ошибки.

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

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

1 Ответ

5 голосов
/ 23 февраля 2011

Вы смешиваете str объекты с unicode объектами, что приводит интерпретатор Python к принуждению одного к другому. Приведение String / 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';')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...