it-swarm.com.ru

Python: удаление \ xa0 из строки?

В настоящее время я использую 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. Кто-нибудь может объяснить это?

186
zhuyxn

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

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

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

Читайте о http://docs.python.org/howto/unicode.html .

Обратите внимание: этот ответ с 2012 года, Python был перенесен, теперь вы сможете использовать unicodedata.normalize

205
samwize

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

Пытаться:

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

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

162
Jamie

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

15
user3590113

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

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

12
user1774699

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

string.replace('\\xa0', ' ')
11
user278064

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

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

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

8
andilabs

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

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

Попробовав несколько методов, чтобы подвести итог, я так и сделал. Ниже приведены два способа избежать/удалить символы\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 в строке. Чтобы удалить их правильно, мы можем использовать два способа.

Метод № 1 (рекомендуется): Первый метод BeautifulSoup get_text с аргументом полосы как 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

Метод № 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'

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

5
Ali Raza Bhayani

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

4
dda

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

mytext = soup.get_text(strip=True)
1
Mark

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

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

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

line = ' '.join(line.split())
0
Jonhy Beebop

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

print(string.strip()) # no more xa0
0
8bitjunkie