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. Кто-нибудь может это объяснить?

Ответ 1

\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 сейчас

Ответ 2

В библиотеке Python unicodedata много полезных вещей. Одна из них - .normalize().

Try:

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

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

Ответ 3

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

Ответ 4

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

Я получил это от этого супер-полезного учебника по юникоду от Ned Batchelder.

Ответ 5

попробуйте следующее:

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

mytext = soup.get_text(strip=True)

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

line = ' '.join(line.split())