Eu recebo um erro com o seguinte padrão:
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)
Não tenho certeza do que u'\ufeff'
é, ele aparece quando estou raspando a web. Como posso remediar a situação? O .replace()
método string não funciona nele.
Respostas:
O caractere Unicode
U+FEFF
é a marca de ordem dos bytes, ou BOM, e é usado para diferenciar a codificação UTF-16 de big e little endian. Se você decodificar a página da Web usando o codec correto, o Python a removerá para você. Exemplos:Observe que
EF BB BF
é uma lista técnica codificada em UTF-8. Não é necessário para o UTF-8, mas serve apenas como uma assinatura (geralmente no Windows).Resultado:
Observe que o
utf-16
codec exige que a BOM esteja presente ou o Python não saberá se os dados são grandes ou pequenos.fonte
Eu me deparei com isso no Python 3 e encontrei esta pergunta (e solução ). Ao abrir um arquivo, o Python 3 suporta a palavra-chave de codificação para lidar automaticamente com a codificação.
Sem ele, a lista técnica é incluída no resultado da leitura:
Fornecendo a codificação correta, a lista técnica é omitida no resultado:
Apenas meus 2 centavos.
fonte
Esse personagem é a lista técnica ou "Byte Order Mark". Geralmente é recebido como os primeiros bytes de um arquivo, informando como interpretar a codificação do restante dos dados. Você pode simplesmente remover o personagem para continuar. Embora, como o erro diga que você estava tentando converter para 'ascii', você provavelmente deveria escolher outra codificação para o que estava tentando fazer.
fonte
O conteúdo que você está raspando é codificado em texto unicode em vez de texto ascii, e você está obtendo um caractere que não se converte em ascii. A 'tradução' correta depende do que a página da web original pensava ser. A página unicode do Python fornece o plano de fundo de como funciona.
Você está tentando imprimir o resultado ou colá-lo em um arquivo? O erro sugere que ele esteja gravando os dados que estão causando o problema e não os lendo. Esta pergunta é um bom lugar para procurar as correções.
fonte
Aqui é baseado na resposta de Mark Tolonen. A sequência incluía diferentes idiomas da palavra 'teste' separados por '|', para que você possa ver a diferença.
Aqui está um teste:
Vale a pena saber que apenas dois
utf-8-sig
eutf-16
recuperar a string original depois de ambosencode
edecode
.fonte
Esse problema surge basicamente quando você salva seu código python em uma codificação UTF-8 ou UTF-16, porque o python adiciona algum caractere especial no início do código automaticamente (o que não é mostrado pelos editores de texto) para identificar o formato de codificação. Mas, quando você tenta executar o código, ele apresenta o erro de sintaxe na linha 1, isto é, o início do código, porque o compilador python entende a codificação ASCII . quando você visualiza o código do arquivo usando a função read () , é possível ver no início do código retornado '\ ufeff' . A solução mais simples para esse problema é apenas alterando a codificação novamente para codificação ASCII(para isso, você pode copiar seu código em um bloco de notas e salvá-lo Lembre-se! escolha a codificação ASCII ... Espero que isso ajude.
fonte