Как удалить определенные символы utf-8 из строки? - PullRequest
0 голосов
/ 28 ноября 2018

В моем случае я хочу удалить только символы и из строки.Я использую BeautifulSoup для анализа некоторых абзацев html и получения от них подстроки.Пока мой код выглядит так:

# -*- coding: cp1252 -*-
from bs4 import BeautifulSoup as bs
import re

soup = bs(open("file.xhtml"), 'html.parser')

for tag in soup.find_all('p', {"class": "fnp2"}) :
    line = unicode(str(tag).split(':')[0], "utf-8")
    line = re.sub('(<p class="fnp2">)(\d+) ', '', line)
    line = line.replace('„', '')
    print line

Но за это я всегда получаю UnicodeDecodeError:

line = line.replace('„', '')

UnicodeDecodeError: 'ascii' codec can't decode byte 0x84 in position
0: ordinal not in range(128)

Какое решение для этого?

1 Ответ

0 голосов
/ 28 ноября 2018

Переменная line в вашем коде является объектом unicode.Когда вы вызываете line.replace, Python ожидает, что первый аргумент также будет unicode объектом.Если вместо этого вы предоставите объект str, Python попытается автоматически декодировать его в строку unicode, используя системную кодировку по умолчанию (которую вы можете проверить с помощью sys.getdefaultencoding()).

Очевидно, системная кодировкаascii в вашем случае.Строка байтов '„' не может быть декодирована с использованием кодека ascii, поскольку '„' не является символом ACII, что приводит к появлению Исключения, которое вы видите.

Вы можете решить проблему, изменив системная кодировка по умолчанию к той же, которую вы использовали для предоставления строки '„' (CP1252, я полагаю), однако такое исправление интересно только с академической точки зрения, поскольку оно просто скрывает проблему под ковром.

Надлежащим, безопасным и простым решением вашей проблемы было бы просто предоставить объект unicode для метода replace.Это будет так же просто, как заменить '„' на u'„' в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...