Вопрос по python, unicode, parsing – Python: удаление \ xa0 из строки?

172

В настоящее время я использую Beautiful Soup для разбора файла HTML и вызоваget_text(), но мне кажется, что у меня осталось \ xa0 Unicode, представляющее пробелы. Есть ли эффективный способ удалить их все в Python 2.7 и заменить их пробелами? Я думаю, что более общий вопрос будет, есть ли способ удалить форматирование Unicode?

Я пытался с помощью:line = line.replace(u'\xa0',' ')как было предложено в другой ветке, но это изменило значения \ xa0 'на u', так что теперь вместо этого у меня везде 'u' ):

РЕДАКТИРОВАТЬ: проблема, кажется, решенаstr.replace(u'\xa0', ' ').encode('utf-8'), но просто делаю.encode('utf-8') безreplace() кажется, что он выплевывает даже более странные символы, например, \ xc2. Кто-нибудь может объяснить это?

уже пробовал, "ASCII" кодек не может декодировать байт 0xa0 в позиции 0: порядковый номер не в диапазоне (128) zhuyxn
Если строка является Unicode, вы должны использоватьu' ' замена, а не' ', Является ли исходная строка юникодом? pepr
попытался использовать str.replace (u '' \ xa0 '', '' ''), но получил \ u "везде вместо \ xa0s: / zhuyxn
str.replace('\xa0',' ')? Oleh Prypin
принять Unicode. использованиеu''с вместо''s. :-) jpaugh

Ваш Ответ

12   ответов
10

попробуй это:

string.replace('\\xa0', ' ')
Error: User Rate Limit Exceededfour bytes: len(b'\\xa0') == 4Error: User Rate Limit Exceededlen(b'\xa0') == 1Error: User Rate Limit Exceeded
189

\ xa0 - это на самом деле неразрывный пробел в Latin1 (ISO 8859-1), также chr (160). Вы должны заменить его пробелом.

string = string.replace(u'\xa0', u' ')

Когда .encode («utf-8»), он будет кодировать Unicode в UTF-8, что означает, что каждый Unicode может быть представлен от 1 до 4 байтов. Для этого случая \ xa0 представлен 2 байтами \ xc2 \ xa0.

Следить за публикациямиhttp://docs.python.org/howto/unicode.html.

Error: User Rate Limit Exceededunicodedata.normalizeError: User Rate Limit Exceeded
Error: User Rate Limit ExceededUnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128).
U+00a0 is a non-breakable space Unicode characterError: User Rate Limit Exceededb'\xa0'Error: User Rate Limit Exceededb'\xc2\xa0'Error: User Rate Limit Exceeded Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededrenameError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
12

Я столкнулся с этой же проблемой, извлекая некоторые данные из базы данных sqlite3 с помощью python. Приведенные выше ответы не сработали для меня (не знаю, почему), но это сработало:line = line.decode('ascii', 'ignore') Однако моей целью было удаление \ xa0s, а не замена их пробелами.

Я получил это отэто супер-полезное руководство по юникоду от Неда Батчелдера.

Error: User Rate Limit Exceeded'ignore'Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded.decode('ascii', 'ignore')
samwize's answerError: User Rate Limit ExceededUnicodeError: User Rate Limit Exceededline.decode()Error: User Rate Limit ExceededbytestringError: User Rate Limit Exceeded.decode()Error: User Rate Limit Exceededthe tutorial that you've linked in your answerError: User Rate Limit Exceeded
Error: User Rate Limit Exceededstr.encode(..., 'ignore')Error: User Rate Limit Exceededtry: ... except: ...Error: User Rate Limit Exceeded
4

Попробовав несколько методов, чтобы подвести итог, я так и сделал. Ниже приведены два способа избежать / удалить символы \ xa0 из проанализированной HTML-строки.

Предположим, у нас есть наш сырой HTML следующим образом:

raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'

Итак, давайте попробуем очистить эту строку HTML:

from bs4 import BeautifulSoup
raw_html = '<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>'
text_string = BeautifulSoup(raw_html, "lxml").text
print text_string
#u'Dear Parent,\xa0This is a test message,\xa0kindly ignore it.\xa0Thanks'

Приведенный выше код производит эти символы\xa0 в строке. Чтобы удалить их правильно, мы можем использовать два способа.

Method # 1 (Recommended): Первый - это BeautifulSoupget_text метод сstrip argument as True Итак, наш код становится:

clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True)
print clean_text
# Dear Parent,This is a test message,kindly ignore it.Thanks

Method # 2: Другой вариант - использовать уникальные данные библиотеки Python.

import unicodedata
text_string = BeautifulSoup(raw_html, "lxml").text
clean_text = unicodedata.normalize("NFKD",text_string)
print clean_text
# u'Dear Parent,This is a test message,kindly ignore it.Thanks'

Я также подробно описал эти методыв этом блоге который вы можете сослаться.

Error: User Rate Limit Exceeded
1

В Beautiful Soup вы можете пройтиget_text() параметр strip, который удаляет пробелы в начале и конце текста. Это удалит\xa0 или любой другой пробел, если он встречается в начале или конце строки. Красивый суп заменил пустую строку на\xa0 и это решило проблему для меня.

mytext = soup.get_text(strip=True)
strip=TrueError: User Rate Limit Exceeded&nbsp;Error: User Rate Limit Exceeded
14

Попробуйте использовать .strip () в конце вашей строки line.strip() работал хорошо для меня

Error: User Rate Limit Exceeded
strip=TrueError: User Rate Limit Exceeded&nbsp;Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded.decode('ascii', 'ignore')
Error: User Rate Limit Exceeded'ignore'Error: User Rate Limit Exceeded
7

Я в конечном итоге здесь, в поисках проблемы с непечатным персонажем. Я использую MySQLUTF-8 general_ci и иметь дело с польским языком. Для проблемных строк я должен выполнить следующее:

text=text.replace('\xc2\xa0', ' ')

Это просто быстрый обходной путь, и вы, вероятно, должны попробовать что-то с правильной настройкой кодировки.

Error: User Rate Limit ExceededtextError: User Rate Limit Exceeded.decode('utf-8')Error: User Rate Limit ExceededsocketError: User Rate Limit Exceeded
1

Универсальная версия с регулярным выражением (удаляются все управляющие символы):

import re
def remove_control_chart(s):
    return re.sub(r'\\x..', '', s)
4

0xA0 (Unicode) - это 0xC2A0 в UTF-8..encode('utf8') просто возьмет ваш Unicode 0xA0 и заменит на UTF-8 '0xC2A0. Следовательно, появление кодирования 0xC2s ... не заменяет, как вы, вероятно, поняли сейчас.

0xc2a0Error: User Rate Limit Exceededb'\xc2\xa0'Error: User Rate Limit Exceeded
6

Попробуйте этот код

import re
re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip()
148

В Python есть много полезных вещейunicodedata библиотека. Одним из них является.normalize() функция.

Пытаться:

new_str = unicodedata.normalize("NFKD", unicode_str)

Замените NFKD любым другим способом, перечисленным в ссылке выше, если вы не получаете результаты, которые вы после.

Error: User Rate Limit Exceedednormalize('NFKD', '1º\xa0dia')Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdocs about unicodedata.normalize
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

Это эквивалент пробела, поэтому удалите его

print(string.strip()) # no more xa0

Похожие вопросы