Atualmente, estou usando a Beautiful Soup para analisar um arquivo HTML e chamar get_text()
, mas parece que estou ficando com muitos \ xa0 Unicode representando espaços. Existe uma maneira eficiente de remover todos eles no Python 2.7 e transformá-los em espaços? Eu acho que a pergunta mais generalizada seria, existe uma maneira de remover a formatação Unicode?
Eu tentei usar line = line.replace(u'\xa0',' ')
:, como sugerido por outro thread, mas isso mudou os \ xa0 para u, então agora tenho "u" em todo lugar. ):
EDIT: O problema parece ter sido resolvido str.replace(u'\xa0', ' ').encode('utf-8')
, mas apenas ficar .encode('utf-8')
sem replace()
parece causar caracteres ainda mais estranhos, \ xc2 por exemplo. Alguém pode explicar isso?
u''
s em vez de''
s. :-)u' '
substituição, não a' '
. A cadeia original é a unicode?Respostas:
\ xa0 é realmente um espaço sem quebra no Latin1 (ISO 8859-1), também chr (160). Você deve substituí-lo por um espaço.
string = string.replace(u'\xa0', u' ')
Quando .encode ('utf-8'), ele codifica o unicode para utf-8, o que significa que cada unicode pode ser representado por 1 a 4 bytes. Nesse caso, \ xa0 é representado por 2 bytes \ xc2 \ xa0.
Leia em http://docs.python.org/howto/unicode.html .
Observação: nesta resposta, a partir de 2012, o Python seguiu em frente, você deve poder usar
unicodedata.normalize
agorafonte
b'\xa0'
byte na codificação latin1, como dois bytesb'\xc2\xa0'
na codificação utf-8. Pode ser representado como
em html.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
.Há muitas coisas úteis na
unicodedata
biblioteca do Python . Um deles é a.normalize()
função.Experimentar:
Substituindo NFKD por qualquer um dos outros métodos listados no link acima, se você não obtiver os resultados que deseja.
fonte
normalize('NFKD', '1º\xa0dia')
retornar '1º dia', mas ele retorna '1º dia'unicodedata.normalize
Tente usar .strip () no final da sua linha
line.strip()
funcionou bem para mimfonte
Depois de tentar vários métodos, para resumir, foi assim que eu fiz. A seguir, estão duas maneiras de evitar / remover caracteres \ xa0 da string HTML analisada.
Suponha que temos nosso html bruto da seguinte forma:
Então, vamos tentar limpar essa string HTML:
O código acima produz esses caracteres \ xa0 na cadeia de caracteres. Para removê-los corretamente, podemos usar duas maneiras.
Método 1 (recomendado): O primeiro é o método get_text da BeautifulSoup com o argumento strip como True. Portanto, nosso código se torna:
Método 2: A outra opção é usar a biblioteca unicodedata do python
Também detalhei esses métodos neste blog que você pode consultar.
fonte
tente isto:
fonte
len(b'\\xa0') == 4
maslen(b'\xa0') == 1
. Se possível; você deve corrigir o montante que gera essas fugas.Corri para o mesmo problema, puxando alguns dados de um banco de dados sqlite3 com python. As respostas acima não funcionaram para mim (não sei por quê), mas funcionou:
line = line.decode('ascii', 'ignore')
No entanto, meu objetivo era excluir os \ xa0s, em vez de substituí-los por espaços.Eu peguei isso neste tutorial unicode super útil de Ned Batchelder.
fonte
'ignore'
é como empurrar a alavanca de câmbio, mesmo que você não entenda como a embreagem funciona ..str.encode(..., 'ignore')
é o equivalente a manipulação de Unicodetry: ... except: ...
. Embora possa ocultar a mensagem de erro, raramente resolve o problema..decode('ascii', 'ignore')
line.decode()
na sua resposta sugere que sua entrada é uma bytestring (você não deve chamar.decode()
uma string Unicode (para aplicá-la, o método é removido no Python 3.) Eu não entendo como é possível ver o tutorial que você ligado em sua resposta e perder a diferença entre bytes e Unicode (não misturá-los).Acabo aqui pesquisando o problema com caracteres não imprimíveis. Eu uso o MySQL
UTF-8
general_ci
e lido com a linguagem polonesa. Para cadeias problemáticas, tenho que proceder da seguinte maneira:É apenas uma solução rápida e você provavelmente deve tentar algo com a configuração de codificação correta.
fonte
text
for uma bytestring que representa um texto codificado usando utf-8. Se você estiver trabalhando com texto; decodifique-o primeiro para Unicode (.decode('utf-8')
) e codifique-o para uma bytestring apenas no final (se a API não suportar diretamente Unicode, por exemplo,socket
). Todas as operações intermediárias no texto devem ser executadas em Unicode.Experimente este código
fonte
0xA0 (Unicode) é 0xC2A0 em UTF-8.
.encode('utf8')
basta pegar seu Unicode 0xA0 e substituí-lo pelo 0xC2A0 da UTF-8. Daí a aparição de 0xC2s ... A codificação não está substituindo, como você provavelmente já percebeu agora.fonte
0xc2a0
é ambíguo (ordem dos bytes). Useb'\xc2\xa0'
bytes literais.É o equivalente a um caractere de espaço, então tire-o
fonte
Em Beautiful Soup, você pode passar
get_text()
o parâmetro strip, que retira o espaço em branco do início e do final do texto. Isso removerá\xa0
ou qualquer outro espaço em branco se ocorrer no início ou no final da string. Beautiful Soup substituiu uma string vazia por\xa0
e isso resolveu o problema para mim.fonte
strip=True
funciona apenas se
estiver no início ou no final de cada bit de texto. Não removerá o espaço se estiver entre outros caracteres no texto.Versão genérica com a expressão regular (removerá todos os caracteres de controle):
fonte
O Python o reconhece como um caractere de espaço, então você pode
split
usá-lo sem argumentos e juntar-se por um espaço em branco normal:fonte