Eu tenho uma string assim:
6Â 918Â 417Â 712
A maneira clara de cortar essa string (pelo que eu entendo Python) é simplesmente dizer que a string está em uma variável chamada s
, obtemos:
s.replace('Â ', '')
Isso deve funcionar. Mas é claro que ele reclama que o caractere não ASCII '\xc2'
no arquivo blabla.py não está codificado.
Nunca consegui entender como alternar entre as diferentes codificações.
Aqui está o código, ele realmente é igual ao anterior, mas agora está no contexto. O arquivo é salvo como UTF-8 no bloco de notas e possui o seguinte cabeçalho:
#!/usr/bin/python2.4
# -*- coding: utf-8 -*-
O código:
f = urllib.urlopen(url)
soup = BeautifulSoup(f)
s = soup.find('div', {'id':'main_count'})
#making a print 's' here goes well. it shows 6Â 918Â 417Â 712
s.replace('Â ','')
save_main_count(s)
Não vai além de s.replace
...
u
Respostas:
Python 2 usa
ascii
como a codificação padrão para arquivos de origem, o que significa que você deve especificar outra codificação no topo do arquivo para usar caracteres Unicode não ASCII em literais. Python 3 usautf-8
como codificação padrão para arquivos de origem, portanto, isso não é um problema.Consulte: http://docs.python.org/tutorial/interpreter.html#source-code-encoding
Para habilitar a codificação de origem utf-8, isso ficaria em uma das duas linhas principais:
O texto acima está nos documentos, mas também funciona:
Considerações adicionais:
O arquivo de origem também deve ser salvo usando a codificação correta em seu editor de texto.
No Python 2, o literal unicode deve ter um
u
antes dele, como ems.replace(u"Â ", u"")
Mas no Python 3, apenas use aspas. No Python 2, você podefrom __future__ import unicode_literals
obter o comportamento do Python 3, mas esteja ciente de que isso afeta todo o módulo atual.s.replace(u"Â ", u"")
também falhará ses
não for uma string Unicode.string.replace
retorna uma nova string e não edita no local, então certifique-se de usar o valor de retorno tambémfonte
# coding: utf-8
.-*-
não é para decoração, mas é improvável que você precise disso. Acho que estava lá para cascas antigas.editar: meu primeiro impulso é sempre usar um filtro, mas a expressão do gerador é mais eficiente em termos de memória (e mais curta) ...
Lembre-se de que isso funcionará com a codificação UTF-8 (porque todos os bytes em caracteres multibyte têm o bit mais alto definido como 1).
fonte
u
se for um literal.fonte
O código a seguir substituirá todos os caracteres não ASCII por pontos de interrogação.
fonte
Usando Regex:
fonte
Tarde demais para uma resposta, mas a string original estava em UTF-8 e '\ xc2 \ xa0' é UTF-8 para NO-BREAK SPACE. Simplesmente decodifique a string original como
s.decode('utf-8')
(\ xa0 é exibido como um espaço quando decodificado incorretamente como Windows-1252 ou latin-1:Exemplo (Python 3)
Resultado
fonte
Isso vai imprimir
6 918 417 712
fonte
Eu sei que é um tópico antigo, mas me senti obrigado a mencionar o método translate, que é sempre uma boa maneira de substituir todos os códigos de caracteres acima de 128 (ou outro, se necessário).
Uso : str. traduzir ( tabela [, deletechars] )
A partir do Python 2.6 , você também pode definir a tabela como Nenhum e usar deletechars para excluir os caracteres que você não deseja, como nos exemplos mostrados nos documentos padrão em http://docs.python.org/library/stdtypes. html .
Com strings Unicode, a tabela de tradução não é uma string de 256 caracteres, mas um dict com ord () de caracteres relevantes como chaves. Mas, de qualquer forma, obter uma string ascii adequada de uma string Unicode é bastante simples, usando o método mencionado por truppo acima, a saber: unicode_string.encode ("ascii", "ignore")
Como resumo, se por algum motivo você absolutamente precisar obter uma string ascii (por exemplo, quando você levanta uma exceção padrão com
raise Exception, ascii_message
), você pode usar a seguinte função:A coisa boa com traduzir é que você pode realmente converter caracteres acentuados em caracteres ascii não acentuados relevantes em vez de simplesmente excluí-los ou substituí-los por '?' Isso geralmente é útil, por exemplo, para fins de indexação.
fonte
e tornar seu
.py
arquivo Unicode.fonte
Este é um hack sujo, mas pode funcionar.
fonte
Pelo que valeu a pena, meu conjunto de caracteres era
utf-8
e eu incluí a clássica# -*- coding: utf-8 -*-
linha " ".No entanto, descobri que não tinha Newlines Universal ao ler esses dados de uma página da web.
Meu texto tinha duas palavras, separadas por "
\r\n
". Eu estava apenas dividindo no\n
e substituindo o"\n"
.Assim que fiz um loop e vi o conjunto de caracteres em questão, percebi o erro.
Portanto, ele também pode estar dentro do conjunto de caracteres ASCII , mas um caractere que você não esperava.
fonte