2017-01-04 7 views
0

Я сломал веб-страницу с помощью BeautifulSoup. я получил большой выход за исключением части списка выглядят как это после получения текста:Python - Юникод и двойная обратная косая черта

list = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013'] 

Мой вопрос в том, как избавиться или заменить эти два раза подряд со специальными символами они.

Если я напечатать первый первый элемент примера список выглядит результат

print list[0] 
that\u2019s 

я уже читал много других вопросов/потоков по этой теме, но я в конечном итоге еще более запутанной, так как Я новичок, рассматривающий unicode/encoding/decoding.

Я надеюсь, что кто-то может помочь мне в этом вопросе.

Спасибо! MG

+0

@mgruber помню, чтобы принять ответ, если он помог вам – eLRuLL

+0

Если веб-страница буквально содержит escape-последовательности unicode, подобные этому (* that \ u2019s * вместо *, то есть *), beautifulsoup не будет возвращать строки в этой форме. Он вернет текст, не ускользая. Как вы получаете эти строки? – roeland

+0

Я выполнял регулярное выражение в одно и то же время, и похоже, что это была проблема. Есть ли у вас какие-либо специальные объяснения? – mgruber

ответ

2

проблема здесь заключается в том, что сайт в конечном итоге двойной кодирующая эти Юникода аргументы, просто сделайте следующее:

ls = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013'] 

ls = map(lambda x: x.decode('unicode-escape'), ls) 

теперь у вас есть список с должным Юникоде строк:

for a in ls: 
    print a 
+0

Я сначала попробовал ваше решение по всему списку, и он не работал. Затем я скопировал ваши 4 строки кода в скрипт и попытался запустить его, и он выбросил следующую ошибку: «UnicodeEncodeError: кодек« charmap »не может кодировать символ u '\ u2019' в позиции 4: символьные карты до ' – mgruber

+0

вас должен включать ваш полный пример, чтобы лучше понять ваш вопрос.Эта новая ошибка происходит, потому что в вашем списке есть строки, у которых нет двойных обратных косых черт, поэтому они уже декодированы. Вам нужно будет удалить хорошие ранее или использовать функцию 'try: except' – eLRuLL

+2

. Скорее всего, это проблема при попытке _print_ декодированной строки в терминале, которая не может правильно отобразить этот символ. Проверьте сообщение об ошибке для строки, в которой произошла ошибка. Этот ответ правильный. – jsbueno

1

Поскольку вы используете Python 2 там, это просто вопрос повторного применения метода «декодирования» - с помощью специального кодека «unicode_escape». Он «видит» в «физических» люфты и декодирует эти последовательности соответствующие символы Юникода:

data = [u'that\\u2019s', u'it\\u2019ll', u'It\\u2019s', u'don\\u2019t', u'That\\u2019s', u'we\\u2019re', u'\\u2013'] 

result = [part.decode('unicode_escape') for part in data] 

Чтобы aAnyone получать здесь с помощью Python3: в этой версии не может применить метод «Decode» к str объектов, поставляемых BeautifulSoup - нужно сначала перекодировать их на объекты с байтовой строкой, а затем декодировать с помощью кодека uncode_escape. Для этих целей полезно использовать в latin1 кодека как transparent кодирования: все байты в объекте ул сохранились в новых байтах объекта:

result = [part.encode('latin1').decode('unicode_escape') for part in data] 
+0

AttributeError: объект 'str' не имеет атрибута 'decode' –

+1

Вы используете Python 3, а OP и этот пример находится в Python2. (В python 2 для начала строка 'u" "' prefixed является объектом unicode, а не str). Пожалуйста, система голосования не предназначена для личных вендоров - она ​​предназначена для обозначения неправильных ответов. – jsbueno

+0

Я не вижу в вопросе каких-либо ссылок на версию Python –